我正在尝试实现currying函数:
function sum(a, b, c) {
console.log('SUM'+JSON.stringify(arguments))
return a + b + c;
}
var curry= function (func,...n) {
return function(...args2) {
//console.log('arg2s'+args2)
return func.apply(this,n.concat(args2));
};
}
curry(sum,1,2)(3) //SUM{"0":1,"1":2,"2":3}, O/P:6
上面给出了正确的输出,但是我没有必要使用apply。
因此,如果我将功能更改为以下:
var curry= function (func,...n) {
return function(...args2) {
//console.log('arg2s'+args2)
return func(n.concat(args2));
};
}
curry(sum,1,2)(3) //SUM{"0":[1,2,3]} O/P:"1,2,3undefinedundefined"
我基本上在这里有两个问题:
2。如何以如下方式调用函数并返回sum:curry(1)(2)(3)/ curry(1,2)(3)/ curry(1,2,3)等,而不是我现在打电话的方式。我可以在网上找到一些解决方案,但听不懂。
ex:
function curry(func) {
return function curriedFunc(...args) {
if (args.length >= func.length) {
return func.apply(this, args);
} else {
return function(...args1) {
return curriedFunc.apply(this, args.concat(args1));
}
}
};
}
任何帮助将不胜感激!
您的func
接受三个参数:a
,b
和c
。当您这样做时:
return func(n.concat(args2));
您要传递它one参数,一个数组。等效于:
const arr = n.concat(args2);
return func(arr);
类似您想将[func
的调用:
return func(...n, ...args2)
使用传播语法,将可迭代项中的每一项都放入参数中。例如,如果中创建的闭包中传递的参数总数。在返回的函数中,将所有参数推入数组,如果数组的长度为3,则返回总和,否则再次返回函数:n
数组有一个项目,则将其设置为传递给func
的第一个参数,如果args2
有2个项目,则将第一个参数设置为传递的第二个参数,将第二个参数设置为第三个参数通过。function sum(a, b, c) { console.log('SUM' + JSON.stringify(arguments)) return a + b + c; } var curry = function(func, ...n) { return function(...args2) { return func(...n, ...args2); }; } curry(sum, 1, 2)(3);
我如何以如下方式调用函数并应返回总和:curry(1)(2)(3)/ curry(1,2)(3)/ curry(1,2, 3)等跟踪在调用此函数的
first
function sum(a, b, c) {
return a + b + c;
}
var curry = function(func, ...argsSoFar) {
const neededArgs = func.length;
const returnedFn = (...args) => {
argsSoFar.push(...args);
if (argsSoFar.length === neededArgs) {
return func(...argsSoFar);
} else {
return returnedFn;
}
};
return returnedFn;
}
console.log(
curry(sum, 1, 2)(3),
curry(sum)(1, 2)(3),
curry(sum)(1)(2, 3),
curry(sum)(1)(2)(3),
);