匿名関数を練習する良い方法は、フォールドまたはマップとして高階関数でそれらを使用することです。
マップをエントリポイントとして使用して、
マップの基本的な定義、
map f [] = []
map f (x:xs) = f x : f xs
例を作成し、
>>> let list = [0..4]
>>> let f x = x + 1
得られた地図を適用して、
>>> map f list
[1,2,3,4,5]
これで、fの宣言を省略し、無名関数を使用して置き換えることができます。
>>> map (\x->x+1) list
[1,2,3,4,5]
次に、 map f list == map(\ x-> x + 1)listを推定し ます。したがって、
f = \x-> x + 1 --- The same as f x = x + 1, but this is the equivalent lambda notation.
次に、単純な関数から始めて、無名関数に変換する方法と、無名関数をラムダ抽象化に依存する方法を確認します。
演習として、fx = 2*xを変換してみてください。
今ではもっと複雑で、2つの引数を取る無名関数、
再び実用的な例、
>>> let add x y = x + y
>>> foldl' add 0 [0..4]
10
次のように無名関数を使用して書き換えることができます、
>>> foldl' (\x y -> x + y) 0 [0..4]
再び等式を使用して、add = \ xy-> x + yと推定し
ます。さらに、hakellの場合と同様に、すべての関数は1つの引数の関数であり、部分的に適用できます。以前の無名関数を次のように書き換えることができます。add= \ x->( \ y-> x + y)。
では、トリックはどこにありますか?なぜなら、無名関数の使用法を高次のものに示し、それから始めて、ラムダ表記を使用して関数を書き換えるためにこれをどのように利用できるかを示しています。つまり、無名関数を書き留める方法を学ぶのにどのように役立つのでしょうか?
高階関数を使用した既存のフレームワークを提供(表示)したからです。
このフレームワークは、この表記法に対応するための大きな機会です。
それから始めて、無限の範囲の運動を推測することができます。たとえば、次のようにしてみてください。
A - Find the corresponding anonymous function ?
1 - let f (x,y) = x + y in map f [(0,1),(2,3),(-1,1)]
2 - let f x y = x * y in foldl' f 1 [1..5]
B - Rewrite all of them using lambda notation into a declarative form (f = \x-> (\y-> ...)
等々 ....
要約する、
としての機能
(F0) f x1 x2 ... xn = {BODY of f}
いつでも次のように書き換えることができます、
(F1) f = \x1 x2 ... xn -> {BODY of f}
どこ
(F2) (\x1 x2 ... xn -> {BODY of f})
F2形式は単なる無名関数であり、関数をラムダ計算形式に純粋に変換したものです。F1は宣言型ラムダ表記です(fを定義するときにfを宣言し、匿名F2にバインドするため)。F0はHaskellerの通常の表記法です。
引数の間に括弧を入れることができるという事実に焦点を当てた最後のメモ、これはクロージャを作成します。これは、関数の引数のサブセットを使用して関数のコードのサブセットを完全に評価できることを意味します(つまり、自由変数が発生しない形式に変換することを意味します)が、それは別の話です。