编写一个 curried javascript 函数,可以调用任意次数 returns 最后一个函数调用的值

Writing a curried javascript function that can be called an arbitrary number of times that returns a value on the very last function call

我目前正在利用个人时间解决一个编程问题,该问题要求我制作一个可以以这种方式调用的 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

我无法弄清楚的是如何在最后一次调用时使其 return 成为一个值。

比如add(1)(2)要工作,那么add(1)就得return一个函数,但是根据说明add(1)自己调用的时候会return 1.

我假设您可以克服此问题的一种方法是弄清楚 add 函数被连续调用了多少次,但我想不出一种方法来实现它。有没有人有任何提示可以指出正确的方向?

我已经阅读了这两篇关于函数柯里化的文章 (1, 2),我理解它们,但是我不确定在处理可变数量的参数时如何进行柯里化。

无法柯里化参数数量未知的可变参数函数。

其中 add 是可变参数函数,您可以这样做

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

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

这根本无法避免,因为柯里化函数将继续 return 一个函数,直到接收到最后一个参数,此时计算为 运行.


唯一的其他选择是创建某种方式 "short-circuit" 参数并通知函数参数已发送完毕。这需要像

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

此处,undefined 表示可变参数结束。我真的不推荐这个,因为它会给你带来其他问题。还别说,也不是特别好看

也不是不可能,用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