所需功能:
mult(3);
//(x) => 3 * mult(x)
mult(3)(4);
//(x) => 3 * (4 * mult(x))
mult(3)(4)();
//12
尝试:
function mult(x){
if(x === undefined){
return 1;
}else{
return (y => x * mult(y));
}
}
结果:
mult(3)
//y => x * mult(y)
//looks pretty good
mult(3)()
//3
//exactly what I want so far.
mult(3)(4)()
//Uncaught TypeError: mult(...)(...) is not a function
果然,
mult(3)(4)
//NaN
但是
mult(3)
和typeof mult(3) === "function"
看起来都不错。是什么赋予了?
难道我不喜欢JS吗?为什么不呢?
最佳答案
在
mult(3)(4)
mult(3)
产生y => 3 * mult(y)
。从而
(y => 3 * mult(y))(4)
变成
3 * mult(4)
mult(4)
产生y => 4 * mult(y)
。3 * (y => 4 * mult(y))
这是胡说八道,因为您试图将
3
与一个函数相乘。这就是为什么在这里获取NaN
的原因,而NaN
本身无法进一步应用。可能的解决方案:
function mkmult(acc) {
return x =>
x === undefined
? acc
: mkmult(acc * x);
}
const mult = mkmult(1);
console.log(mult(3)());
console.log(mult(3)(4)());
console.log(mult(3)(4)(5)());
关于javascript - 功能性JavaScript:闭包和递归。为什么会失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48872640/