我在一些文章和博客中看到了curry函数的引用,但我找不到一个好的解释(或者至少一个有意义的解释!)
当前回答
在函数代数中,处理带有多个参数的函数(或相当于一个n元组的参数)有点不优雅——但是,正如Moses Schönfinkel(以及Haskell Curry)所证明的那样,这是不需要的:您所需要的只是带有一个参数的函数。
那么如何处理自然表示为f(x,y)的式子呢?好吧,你把它等价于f(x)(y)——f(x),叫它g,是一个函数,你把这个函数应用到y上。换句话说,你只有带一个参数的函数——但其中一些函数返回其他函数(也带一个参数;-)。
像往常一样,维基百科对此有一个很好的总结条目,有许多有用的指针(可能包括关于你最喜欢的语言的;-),以及稍微更严格的数学处理。
其他回答
下面是泛型和最短版本的函数用n no curry的例子。的参数。
const add = a => b => b ? add(a + b) : a;
Const add = a => b => b ?Add (a + b): a; console.log(添加(1)(2)(3)(4)());
curry是指将一个接受多个参数的函数分解为一系列函数,每个函数只接受一个参数。下面是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); // returns 7
var add3 = add(3); // returns a function
add3(4); // returns 7
第一个语句返回7,就像add(3,4)语句一样。 第二条语句定义了一个名为add3的新函数 给它的参数加上3。(这就是有些人所说的终结。) 第三条语句再次使用add3操作将3添加到4 结果是7。
curry是Java Script的高阶函数之一。
curry是一个包含许多参数的函数,它会被重写,这样它会接受第一个参数并返回一个函数,而这个函数会使用剩余的参数并返回值。
困惑吗?
让我们看一个例子,
function add(a,b)
{
return a+b;
}
add(5,6);
这类似于下面的咖喱函数,
function add(a)
{
return function(b){
return a+b;
}
}
var curryAdd = add(5);
curryAdd(6);
那么这个代码是什么意思呢?
现在再读一遍定义,
curry是一个包含许多参数的函数,它被重写为接受第一个参数并返回一个函数,该函数反过来使用剩余的参数并返回值。
不过,困惑吗? 让我来详细解释一下!
当你调用这个函数时,
var curryAdd = add(5);
它会返回一个这样的函数,
curryAdd=function(y){return 5+y;}
这叫做高阶函数。也就是说,依次调用一个函数返回另一个函数是高阶函数的精确定义。这是图例的最大优势,Java Script。 回到咖喱,
这一行将把第二个参数传递给curryAdd函数。
curryAdd(6);
结果是,
curryAdd=function(6){return 5+6;}
// Which results in 11
希望你能理解这里咖喱的用法。 那么,说到优点,
为什么鞭笞?
它利用了代码可重用性。 代码越少,错误越少。 你可能会问它是怎么少代码的?
我可以证明它与ECMA脚本6新的特征箭头功能。
是的!ECMA 6,为我们提供了美妙的功能,叫做箭头函数,
function add(a)
{
return function(b){
return a+b;
}
}
借助箭头函数,我们可以将上面的函数写成如下形式:
x=>y=>x+y
酷吧?
所以,更少的代码和更少的错误!!
在这些高阶函数的帮助下,可以很容易地开发出无bug的代码。
我向你挑战!
霍普,你知道什么是咖喱。如果你有任何需要澄清的地方,请在这里评论。
谢谢,祝您愉快!
在这里,您可以找到c#中curry实现的简单解释。在评论中,我试图展示咖喱是如何有用的:
public static class FuncExtensions {
public static Func<T1, Func<T2, TResult>> Curry<T1, T2, TResult>(this Func<T1, T2, TResult> func)
{
return x1 => x2 => func(x1, x2);
}
}
//Usage
var add = new Func<int, int, int>((x, y) => x + y).Curry();
var func = add(1);
//Obtaining the next parameter here, calling later the func with next parameter.
//Or you can prepare some base calculations at the previous step and then
//use the result of those calculations when calling the func multiple times
//with different input parameters.
int result = func(1);
“Currying”是一个获取多个参数的函数并将其转换为一系列函数的过程,每个函数接受一个参数并返回一个参数的函数,或者在最终函数的情况下,返回实际结果。