有没有办法在Javascript中进行可变递归currying?

时间:2015-04-05 05:38:57

标签: javascript recursion functional-programming currying

我知道可能没有任何理由将其用于创建可变参数函数的其他方式,但在语义上是否可以定义某些内容来执行此操作?例如,它可以像sum(1)(2)(3)();一样调用。我尝试使用以下代码实现它:

function sum(x) {
    return function(y) {
        if (!y) return 0;
        else return x + sum(y);
    };
}

然而,在调用时,这会给出TypeError: string is not a function。什么会导致这返回一个字符串?当我更仔细地检查它时,它看起来像是将函数的代码作为字符串返回,这对我来说毫无意义。也就是说,我并不十分熟悉错综复杂的JavaScript的语义,所以我可能会错过一些巨大的概念。

2 个答案:

答案 0 :(得分:1)

sum(1) -> ref Function(y)
sum(1)(2) -> invocation Function(2)
Function(2) -> 1 + (sum(y) -> sum(2) -> ref Function(y))

现在,1 + (ref Function(y)),您可以看到,您正在添加数字和参考。

javascript认为你正在尝试连接,因此它在内部调用ToString Function方法,它将函数体作为字符串。

所以,下次你打电话时,你正在调用一个字符串,因此错误就像字符串一样不是一个函数。

正确的代码将是Bergi实施的。

答案 1 :(得分:1)

如评论中所述,x是一个数字,sum(y)是一个函数。在它们上使用+运算符使用它们的gcd类型,它们是字符串,不能被调用。

你不能在javascript中curry运算符。您需要显式返回curried函数,并告诉它何时计算值。我们的功能的适当修复将是

function sum(x) {
    return function(y) {
        if (!y) return x;
//                     ^
        else return sum(x + y);
//                      ^^^
    };
}