以下是我从本电子书中摘录的一个例子(http://www.cs.cornell.edu/riccardo/prog-smlnj/notes-011001.pdf)
-fun curry (f:'a * 'b -> 'c) = fn (x:'a) => fn (y:'b) => f (x,y);
val curry = fn : ('a * 'b -> 'c) -> 'a -> 'b -> 'c
如何解释此功能。 Curry将'a *'b - >类型的函数f作为参数。 'C。我无法理解'='之后的部分。关联顺序是什么?
这是另一个例子:
fun add’ (x:int) (y:int):int = x + y;
这是如何解析的?
维基百科说“currying是一种转换函数的技术,该函数采用多个参数(或参数的n元组),使得它可以被称为一个函数链,每个函数都有一个参数(部分应用程序) ”。哪个是单个参数:多个参数中的第一个或最后一个?
答案 0 :(得分:2)
fn (x:'a) => fn (y:'b) => f (x,y)
被解析为fn (x:'a) => (fn (y:'b) => f (x,y))
。所以你有一个函数,它接受类型为a的参数x并返回另一个函数,它接受类型为b的参数y。然后,此其他函数返回调用f (x,y)
的结果。
fun foo x y = ...
是val foo = fn x => fn y => ...
的语法糖,所以foo
是一个函数,它接受一个参数x并返回另一个函数,它接受一个参数y。
类似地,调用foo 1 2
将被解析为(foo 1) 2
,即它使用参数1调用函数foo
,然后使用参数2调用结果函数。