我在几篇文章和博客中都看到过关于咖喱函数的引用,但我找不到很好的解释(或者至少有一个合理的解释!)
咖喱化是指将一个包含多个参数的函数分解为一系列仅包含一个参数的函数。这是 JavaScript 中的示例:
function add (a, b) {
return a + b;
}
add(3, 4); // returns 7
这个函数接受两个参数 a 和 b 并返回它们的总和。现在,我们将使用此函数:
function add (a) {
return function (b) {
return a + b;
}
}
这是一个接受一个参数 a 的函数,并返回接受另一个参数 b 的函数,该函数返回它们的总和。
add(3)(4);
var add3 = add(3);
add3(4);
第一条语句返回 7,就像 add(3,4)语句一样。第二条语句定义了一个名为 add3 的新函数,该函数会将 3 加到其参数中。这就是某些人所谓的关闭。第三条语句使用 add3 操作将 3 加到 4,结果再次产生 7。
在函数的代数中,处理带有多个参数(或等效的一个参数为 N 元组)的函数有些微不足道 - 但是,正如 MosesSchönfinkel(以及独立的 Haskell Curry)所证明的那样,不需要它:所有人需要的是带有一个参数的函数。
那么如何处理自然表达为f(x,y)
呢?好吧,您认为这等效于f(x)(y)
f(x)
,称它为g
是一个函数,然后将该函数应用于y
。换句话说,您只有具有一个参数的函数 - 但是其中一些函数会返回其他函数(也带有一个参数;-)。
像往常一样,维基百科对此有一个很好的总结条目,其中包含许多有用的指针(可能包括与您喜欢的语言有关的指针;-)以及更严格的数学处理方法。
这是一个具体的例子:
假设您有一个计算作用在物体上的重力的函数。如果您不知道公式,可以在这里找到。此函数将三个必需参数作为参数。
现在,在地球上,您只想计算该星球上物体的力。用功能语言,您可以将地球质量传递给功能,然后对其进行部分评估。您会得到的是另一个仅包含两个参数并计算地球上物体的重力的函数。这称为 “柯里化”。