编写一个 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
函数被连续调用了多少次,但我想不出一种方法来实现它。有没有人有任何提示可以指出正确的方向?
无法柯里化参数数量未知的可变参数函数。
其中 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
我目前正在利用个人时间解决一个编程问题,该问题要求我制作一个可以以这种方式调用的 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
函数被连续调用了多少次,但我想不出一种方法来实现它。有没有人有任何提示可以指出正确的方向?
无法柯里化参数数量未知的可变参数函数。
其中 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