Haskell などの言語の優れた点 (F# では非常に似ていますが、正確な構文はわかりません。これは理解に役立つはずです -> ですが)、引数の一部のみを適用して、カリー化された機能:
adder n x y = n + x + y
言い換えれば、「私に3つのものをください。それらを足し合わせます」. 数値を投げると、コンパイラは nx と y の型を推測します。あなたが書くと言う
adder 1 2 3
1、2、3 の型は Int です。したがって:
adder :: Int -> Int -> Int -> Int
つまり、3 つの整数を与えてください。最終的には整数になります。または、次のように言っているのと同じです。
five :: Int
five = 5
しかし、ここがいいところです!これを試して:
add5 = adder 5
ご存じのとおり、adder は int、int、int を受け取り、int を返します。ただし、すぐにわかるように、それは完全な真実ではありません。実際、add5 は次のタイプになります。
add5 :: Int -> Int -> Int
整数 (一番左) を「はがし」、関数に直接貼り付けたかのようになります。関数シグネチャをよく見てみると、 -> が右結合であることがわかります。
addder :: Int -> (Int -> (Int -> Int))
これにより、非常に明確になるはずです: adder に最初の整数を与えると、最初の矢印の右側にあるものに評価されます。または:
add5andtwomore :: Int -> (Int -> Int)
add5andtwomore = adder 5
「adder 5」の代わりに add5andtwomore を使用できるようになりました。このようにして、別の整数を適用して (たとえば) "add5and7andonemore" を取得できます。
add5and7andonemore :: Int -> Int
add5and7andonemore = adder 5 7
ご覧のとおり、add5and7andonemore はまったく別の引数を必要としており、それを与えると突然整数になります!
> add5and7andonemore 9
=> ((add5andtwomore) 7) 9
=> ((adder 5) 7) 9)
<=> adder 5 7 9
(5 7 9) を加算器 (nxy) にパラメータを代入すると、次のようになります。
> adder 5 7 9 = 5 + 7 + 9
=> 5 + 7 + 9
=> 21
実際、plus は int を取り、別の int を返す単なる関数でもあるため、上記は実際には次のようになります。
> 5 + 7 + 9
=> (+ 5 (+ 7 9))
=> (+ 5 16)
=> 21
ほら!