什么是“咖喱”?

我在几篇文章和博客中看到了对curried函数的引用,但我找不到一个很好的解释(或者至少一个有意义的解释!


答案 1

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;
  }
}

这是一个函数,它接受一个参数 ,并返回一个接受另一个参数的函数,该函数返回其总和。ab

add(3)(4);

var add3 = add(3);

add3(4);

第一个语句返回 7,就像该语句一样。第二个语句定义了一个名为的新函数,该函数将向其参数添加 3。(这就是一些人可能所说的闭包。第三个语句使用该操作将 3 添加到 4,结果再次生成 7。add(3, 4)add3add3


答案 2

在函数代数中,处理采用多个参数(或等效的一个N元组参数)的函数有些不优雅 - 但是,正如Moses Schönfinkel(以及独立的Haskell Curry)所证明的那样,它不需要:你所需要的只是接受一个参数的函数。

那么,你如何处理你自然而然地表达的东西呢?好吧,你把它当作等同于-- ,称之为,是一个函数,你把这个函数应用到。换句话说,你只有接受一个参数的函数 - 但其中一些函数返回其他函数(也接受一个参数;-)。f(x,y)f(x)(y)f(x)gy

像往常一样,维基百科有一个很好的摘要条目,有许多有用的指针(可能包括关于你最喜欢的语言的指针;-)以及稍微更严格的数学处理。