编写一个curried javascript函数,可以调用任意次数,在最后一次函数调用中返回一个值

时间:2015-11-24 19:05:07

标签: javascript functional-programming currying

我目前在个人时间处理编程问题,要求我创建一个可以这种方式调用的javascript函数。

add(1) // 1
add(1)(2) // 3
add(1)(2)(3); // 6
add(1)(2)(3)(4); // 10
add(1)(2)(3)(4)(5); // 15

我无法弄清楚如何让它在最后一次通话时返回一个值。

例如,为了让add(1)(2)起作用,add(1)必须返回一个函数,但根据说明add(1),当它自己调用时将返回1

我假设你可以克服这个问题的一种方法是弄清楚add函数被连续多少次被调用,但是我想不出有办法实现这一点。有没有人有任何可以指引我朝正确方向发展的提示?

我已经阅读了这两篇文章(12)关于函数curry并且我理解它们,但是我不确定在处理变量时如何进行currying争论的数量。

2 个答案:

答案 0 :(得分:4)

使用未知数量的参数来讨论可变参数函数是不可能的。

add是一个可变函数,你可以做类似

的事情
var add5 = curryN(add, 5);
add5(1)(2)(3)(4)(5); //=> 15

var add3 = curryN(add, 3);
add3(1)(2)(3); //=> 6

根本没有避免这个问题,因为一个curried函数将继续返回一个函数,直到收到最后一个参数,此时运行计算。

唯一的另一种选择是创造一些方法来短路"参数并通知函数已完成参数的发送。这需要像

这样的东西
var xadd = curryUntilUndefined(add);
xadd(1)(2)(3)(4)(5)(undefined); //=> 15

这里,undefined表示可变参数的结束。我不是真的推荐这个,因为它可以为你创造其他问题。更不用说,看起来并不是特别好。

答案 1 :(得分:1)

这不可能,使用valueOf()。



function add(initNum) {
    var sum = initNum;
    var callback = function (num) {
        sum += num;
        return callback;
    };
    callback.valueOf = function () {
        return sum;
    };
    return callback;
};
console.log(add(1)(2)==3);            //true
console.log(add(1)(1)+1);             //3
console.log(add(1)(2)(3).valueOf());  //6