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);
(1) compose (compose, uncurry compose)
(2) compose (uncurry compose, compose)
如果您查看类型,那么您将清楚地看到curry
和uncurry
的作用。
请记住可以定义函数,这些函数将其参数作为一个大元组或多个参数接受(实际上它变成了一个“链”函数,每个函数都接受1个参数,参见此维基百科):
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
首先将数字4作为参数x
应用于bar 1
,然后将该计算的结果(bar 1 4
)作为x
参数提供给foo
。
显然,uncurry
被用于反向过程:
- uncurry bar;
val it = fn : int * int -> int