有没有一种方法可以在Javascript中进行变量递归转换?

有没有一种方法可以在Javascript中进行变量递归转换?,javascript,recursion,functional-programming,currying,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不是一个函数。什么会导致它返回字符串?当我更仔细地

我知道可能没有任何理由用它来创建一个变量函数,但是从语义上来说,有可能定义一些东西来做这个吗?例如,可以像
sum(1)(2)(3)()那样调用它。我试图用以下代码实现它:

function sum(x) {
    return function(y) {
        if (!y) return 0;
        else return x + sum(y);
    };
}
然而,当调用时,它给出了
TypeError:string不是一个函数
。什么会导致它返回字符串?当我更仔细地检查它时,它看起来像是以字符串形式返回函数的代码,这对我来说毫无意义。也就是说,我对复杂JavaScript的语义并不十分熟悉,因此我可能会遗漏其中的一些重要概念

sum(1) -> ref Function(y)
sum(1)(2) -> invocation Function(2)
Function(2) -> 1 + (sum(y) -> sum(2) -> ref Function(y))
现在,
1+(ref函数(y))
,如您所见,您正在添加一个数字和一个引用

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

因此,下次调用时,您正在调用一个字符串,因此错误为字符串不是函数


正确的代码就是Bergi实现的代码。

如评论中所述,
x
是一个数字,
sum(y)
是一个函数。对它们使用
+
运算符将使用它们的gcd类型,这些类型是字符串,无法调用

不能在javascript中使用curry运算符。您需要显式返回一个curried函数,并告诉它何时计算值。对于我们的功能,一个合适的修复方法是

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

sum(1)(2)
返回
String
“1function(y){if(!y)返回0;else返回x+sum(y);}”
console.log(type of sum(1)(2)(3))
sum(1)(2)(3)
返回
类型错误:字符串不是函数
预期结果是什么?编辑:响应编辑:sum(1)(2)应该返回一个函数,当在没有参数的情况下调用该函数时,该函数将返回0(或者,如果给定参数,将返回另一个函数)。然后,该函数将用于使表达式为1+2+0或3。预期结果为
sum(1)(2)(3)()
将是6,因为
sum(1)
将返回一个用2调用的函数,它将变成1+sum(2),这将做同样的事情(2+sum(3)),变成3+0,返回3,返回5,返回6。(天哪,这很难解释)由于
sum
返回一个函数,
x+sum(y)
将该函数转换为字符串并执行字符串连接。“sum(1)(2)应该返回函数”,但内部函数从不返回函数本身。它要么返回
0
要么返回
x+sum(y)
。为什么
sum(y)
不递归调用函数
x+sum(y)
作为一个表达式,应该减少为一个整数。“为什么
sum(y)
不递归调用该函数?”它当然会调用
sum
。但是
sum
返回一个函数。尚不清楚
number+函数
应该如何变成数字。您的代码实际上不起作用<代码>var addOne=添加(1);加一(3)项(;/)4但是
addOne(1)(//5
?@Bergi不知道怎么做。但这对我很有效。你为什么把调用留在
add(1)
?哦,对了,我没有意识到你做得有多错,也没有尝试反例。最后一个不会产生
1
而不是
5
,这仍然不是预期的
2
。一个更简单的反例:
var getOne=add(1);getOne();//1 getOne()//0???
。求和表达式…