有没有办法链接一个curried函数,以便你可以进行任意数量的调用?以下示例仅允许您应用该函数两次,第一次调用curry函数,第二次调用add函数返回一个数值。
var slice = Array.prototype.slice;
function curry(fn) {
var storedArgs = slice.call(arguments, 1);
return function () {
var newArgs = slice.call(arguments),
args = storedArgs.concat(newArgs);
return fn.apply(null, args);
}
}
function add () {
var numbersToAdd = slice.call(arguments);
var total = 0;
for (var i = 0, numberCount = numbersToAdd.length; i < numberCount; i++) {
total += numbersToAdd[i];
}
return total;
}
console.log(curry(add, 1000)(1, 1, 1, 1, 1, 1, 1, 1));
//does not work because number is returned rather than a function after second invocation
//console.log(curry(add, 1000)(1, 1, 1, 1, 1, 1, 1, 1)(1));
答案 0 :(得分:1)
这通常是不可能的,不仅仅是在JavaScript中。
curry(add, 1000)
的结果是function
。
使用:curry(add, 1000)(1, 1, 1, 1, 1, 1, 1, 1)
调用它会返回number
。
它不能同时返回number
和function
,它必须是。
一种可能性是制作弱咖喱。类似的东西:
create_aggregator(add, 1000).aggregate(1, 1, 1, 1, 1).aggregate(1).finalize();
.finalize()
将为您提供结果编号。
你可以尝试涉足一些黑魔法并制作一个从Function
延伸的数字类型。这在JavaScript中是可行的,因为函数是对象。
答案 1 :(得分:0)
这是我能提出的最佳解决方案:
function sum() {
var total = 0;
fn = function() {
for(var i = 0; i < arguments.length; i++) {
total += arguments[i];
}
fn.total = total;
return fn;
};
return fn.apply(null, arguments);
}
总计作为密钥存储在函数中:total
这是一个小提琴: http://jsfiddle.net/jmeyers91/hsuf9v04/
编辑: 我不确定如何编写从常规函数生成此函数的高阶函数。