什么是“咖喱”?
2022-08-29 22:29:31
我在几篇文章和博客中看到了对curried函数的引用,但我找不到一个很好的解释(或者至少一个有意义的解释!
我在几篇文章和博客中看到了对curried函数的引用,但我找不到一个很好的解释(或者至少一个有意义的解释!
Currying是指将一个函数分解为一个函数,该函数将多个参数分解为一系列函数,每个函数只接受一个参数。下面是 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,就像该语句一样。第二个语句定义了一个名为的新函数,该函数将向其参数添加 3。(这就是一些人可能所说的闭包。第三个语句使用该操作将 3 添加到 4,结果再次生成 7。add(3, 4)
add3
add3
在函数代数中,处理采用多个参数(或等效的一个N元组参数)的函数有些不优雅 - 但是,正如Moses Schönfinkel(以及独立的Haskell Curry)所证明的那样,它不需要:你所需要的只是接受一个参数的函数。
那么,你如何处理你自然而然地表达的东西呢?好吧,你把它当作等同于-- ,称之为,是一个函数,你把这个函数应用到。换句话说,你只有接受一个参数的函数 - 但其中一些函数返回其他函数(也接受一个参数;-)。f(x,y)
f(x)(y)
f(x)
g
y
像往常一样,维基百科有一个很好的摘要条目,有许多有用的指针(可能包括关于你最喜欢的语言的指针;-)以及稍微更严格的数学处理。