1

私はちょうど、この機能がどのような種類の最適化の結果として下の中間表現であるかに関する好奇心から、知りたいですか?私は$が実際には1つの引数だけで提供される関数であることを理解しています。何らかの形で、この関数を 'map'によって提供されるリストからの関数に適用することによって、 '$'関数が正確に関数に欠けていることを管理します。この最適化の動作は、 '$'を使用した関数アプリケーション固有のものですか?なぜなら、私はそれがどのような価値を持っているのか、それが「地図」と「$」の関数定義からどのように続くのかを見ることができないからです。

最初から、 '$ 3'は関数式の前に出現するはずですが、そのような式はコンパイラで評価されないようです。ここでは、最適化の拡大仲介式があり、それは一見行われている:

[(4+) $3, (10*) $3, (^2) $3, sqrt $3] 

定義を - $

($) :: (a -> b) -> a -> b 
f $ x = f x 

定義 - 地図

map :: (a -> b) -> [a] -> [b] 
map _ [] = [] 
map f (x:xs) = f x : map f xs 

例は

map ($ 3) [(4+), (10*), (^2), sqrt] 
を使用しました

結果

[7.0,30.0,9.0,1.7320508075688772] 

答えて

7

になって私が正しくあなたの質問を理解していれば、あなたは($ 3)を書くとどうなるか疑問に思っていますか?

ハスケル構文には「Section of an infix operator」という概念があります。

(2 +) == \x -> 2 + x == (+) 2 
(+ 2) == \x -> x + 2 == flip (+) 2 

Haskellは機能プログラミング言語です:それはあなたがして(ここでは+)演算子と式を書く場合ことを意味します。関数型プログラミング言語の側面の1つは、関数をパラメータとして使用できることです。これは関数型プログラミング言語に限定されず、Java、C#、C++などでは関数/メソッド参照を関数/メソッドに渡すことができます。たとえば、これらの関数をパラメータで呼び出すことができます。

だからあなたが書かれています:

map (\x -> ($) x 3) [(4+), (10*), (^2), sqrt] 

\x -> ($) x 3は普通の関数です。我々は最初の引数にこれを適用するのであれば、我々が得る:

(\x -> ($) x 3) (4+) 
-> ($) (4+) 3 
-> (4+) 3 
-> 4 + 3 
-> 7 

をそう($ 3)場合と何も特別なことはありません、それは我々が唯一の演算子の右側に記入任意の演算子で動作します。

実際には、すでに(^2)でその概念を使用しています。実際にあなたのリストは次のようになります:

map (flip ($) 3) [(+) 4, (*) 10, flip (^) 2, sqrt] 

したがって、リストの要素には左右のセクションを使用しました。

+0

ありがとうございました!それは上のスポットです! –

+1

と説明には賢明な優雅さがあります。本当にありがとうございます。 –

関連する問題