Javascript currying并支持任意数量的调用

时间:2014-08-20 15:41:25

标签: javascript currying

有没有办法链接一个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));

2 个答案:

答案 0 :(得分:1)

这通常是不可能的,不仅仅是在JavaScript中。

curry(add, 1000)的结果是function

使用:curry(add, 1000)(1, 1, 1, 1, 1, 1, 1, 1)调用它会返回number

它不能同时返回numberfunction,它必须是。


一种可能性是制作弱咖喱。类似的东西:

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/

编辑: 我不确定如何编写从常规函数生成此函数的高阶函数。