所需功能:

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/

10-09 02:55