事实上,柯里化函数并不是一个接收一个函数并产生另一个函数的函数。那是一个高阶函数。
柯里化函数只是一个接受多个参数的函数,并且可以通过只给它一个参数来部分应用。
例如,对于您的 sigma 问题,
fun sigma (f,m,n) = ...
不是柯里化函数,因为它只需要一个参数(元组(f,m,n)
。)
fun sigma f m n = ...
但是,它是一个柯里化函数,因为它需要三个参数,并且可以这样说
val sigmasquare = sigma (fn x => x * x)
,通过给它的第一个参数部分应用 sigma。
一个更简单的例子是
fun add (x,y) = x + y
这是一个非柯里化函数。要评估它,你必须给它它的论点,其中包括x
和y
。add (3,5)
在这种情况下,将评估为 8。
fun add x y = x + y
是同一函数的咖喱版本。这可以通过给出它来部分评估x
。例如,add 3
将评估一个函数,该函数将向其参数添加三个。
通过将前面的示例视为匿名或 lambda 函数可以更清楚地看到这一点。
第一个等效于fn (x,y) => x + y
,它显然需要两个整数并计算为一个整数。
第二个等效于fn x => fn y => x + y
,它接受一个 int 并评估为一个采用另一个 int 并评估为 int 的函数。
因此,第一个的类型是(int * int) -> int
,而第二个的类型是int -> int -> int
。
希望这可以清除一些咖喱。