在ML中的高阶函数中有什么咖喱和不干扰

Jen*_*sen 6 ml sml currying higher-order-functions

fun curry f x y = f (x, y); 
fun uncurry f (x, y) = f x y; 
fun compose (f, g) x = f (g x);
Run Code Online (Sandbox Code Playgroud)

我理解compose功能,但不太了解ML中的curry和uncurry.谁能解释一下这些?

另外,以下两行是什么意思?

(1) compose (compose, uncurry compose)
(2) compose (uncurry compose, compose)
Run Code Online (Sandbox Code Playgroud)

Jes*_*erg 11

如果您查看类型,那么您将清楚地看到什么curryuncurry做什么.

请记住,可以定义函数,该函数将其参数作为一个大元组,或者作为多个参数(实际上它成为函数的"链",每个参数都有1个参数,请参阅此wiki):

fun foo (a,x) = a*x+10
fun bar a x = a*x+20
Run Code Online (Sandbox Code Playgroud)

在他们的类型中可以清楚地看到差异:

val foo = fn : int * int -> int
val bar = fn : int -> int -> int
Run Code Online (Sandbox Code Playgroud)

curry函数将一个将其参数作为元组的函数"转换"为函数的"链",每个函数都接受1个参数.当我们想要编写一系列函数时,这是特别方便的,其中一些函数已经部分地应用了参数.了解foo更改类型:

- curry foo;
val it = fn : int -> int -> int
Run Code Online (Sandbox Code Playgroud)

现在我们可以尝试组合这两个函数:

- (curry foo 5 o bar 1) 4;
val it = 130 : int
Run Code Online (Sandbox Code Playgroud)

将前4 bar 1作为参数应用x,然后将该calculate(bar 1 4)的结果作为x参数给出foo.

显然uncurry用于反向过程:

- uncurry bar;
val it = fn : int * int -> int
Run Code Online (Sandbox Code Playgroud)