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中的curry和uncurry。任何人都可以解释这些吗?
另外,以下两行是什么意思?
(1) compose (compose, uncurry compose)
(2) compose (uncurry compose, compose)
答案 0 :(得分:11)
如果你查看类型,那么你会清楚地看到curry
和uncurry
的作用。
请记住,可以定义函数,该函数将其参数作为一个大元组,或者作为多个参数(实际上它成为函数的“链”,每个参数都带有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
现在我们可以尝试编写这两个函数:
- (curry foo 5 o bar 1) 4;
val it = 130 : int
前4个作为参数bar 1
应用于x
,然后计算结果(bar 1 4
)作为x
参数给出foo
}。
显然uncurry
用于反向过程:
- uncurry bar;
val it = fn : int * int -> int