7
fun curry f x y = f (x, y); 
fun uncurry f (x, y) = f x y; 
fun compose (f, g) x = f (g x);

Compose 関数は理解できますが、ML のカリーとアンカリーがよくわかりません。誰でもこれらを説明できますか?

また、次の2行はどういう意味ですか?

(1) compose (compose, uncurry compose)
(2) compose (uncurry compose, compose)
4

1 に答える 1

13

タイプを見ると、何が何をしているのかがはっきりとわかり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として に与えられます。xfoo

明らかuncurryに逆のプロセスに使用されます。

- uncurry bar;
val it = fn : int * int -> int
于 2011-12-06T12:52:56.660 に答える