需要帮助了解currying

时间:2011-07-30 05:59:24

标签: sml

以下是我从本电子书中摘录的一个例子(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元组),使得它可以被称为一个函数链,每个函数都有一个参数(部分应用程序) ”。哪个是单个参数:多个参数中的第一个或最后一个?

1 个答案:

答案 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调用结果函数。