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)
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)
如果您查看类型,那么您将清楚地看到什么curry
和做什么uncurry
。
请记住,可以定义将其参数作为一个大元组或多个参数的函数(实际上它变成了一个函数的“链”,每个函数都有一个参数,请参阅此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
函数将一个将其参数作为元组的函数“转换”为一个函数“链”,每个函数都接受一个参数。当我们想要组合一系列函数,其中一些函数已部分应用参数时,这特别方便。看看类型foo
是如何改变的:
- curry foo;
val it = fn : int -> int -> int
现在我们可以尝试组合这两个函数:
- (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