タイプを見ると、何が何をしているのかがはっきりとわかりcurry
ますuncurry
。
引数を 1 つの大きなタプルとして、または複数の引数として受け取る関数を定義できることに注意してください (実際には、それぞれが 1 つの引数を取る関数の「チェーン」になります。このwikiを参照してください)。
fun foo (a,x) = a*x+10
fun bar a x = a*x+20
違いは、それらのタイプに明確に見られます。
val foo = fn : int * int -> int
val bar = fn : int -> int -> int
このcurry
関数は、引数をタプルとして受け取る関数を、それぞれが 1 つの引数を取る関数の「チェーン」に「変換」します。これは、一部の関数に引数が部分的に適用されている一連の関数を作成する場合に特に便利です。の型がどのようにfoo
変更されるかを確認します。
- curry foo;
val it = fn : int -> int -> int
これで、2 つの関数を試して構成できます。
- (curry foo 5 o bar 1) 4;
val it = 130 : int
bar 1
最初に 4 が引数として に適用されx
、次にその計算の結果 ( ) が引数bar 1 4
として に与えられます。x
foo
明らかuncurry
に逆のプロセスに使用されます。
- uncurry bar;
val it = fn : int * int -> int