有没有办法在 Javascript 中进行可变递归柯里化?
Is there a way to do variadic recursive currying in Javascript?
我知道可能没有任何理由使用它来代替其他创建可变参数函数的方法,但是在语义上是否可以定义一些东西来做到这一点?例如,它可以被称为 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
。什么会导致 return 一个字符串?当我更仔细地检查它时,它看起来像是 return 将函数的代码作为字符串,这对我来说毫无意义。也就是说,我对复杂 JavaScript 的语义并不十分熟悉,因此我可能会遗漏其中的一些重要概念。
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 认为您正在尝试连接,因此它在内部调用 Function
的 ToString
方法,该方法将函数体作为字符串提供。
因此,下次调用时,您调用的是字符串,因此出现错误,因为字符串不是函数。
Bergi 已经实现了正确的代码。
如评论中所述,x
是一个数字,sum(y)
是一个函数。在它们上使用 +
运算符使用它们的 gcd 类型,它们是字符串,无法调用。
您不能在 javascript 中柯里化运算符。您需要显式 return 柯里化函数,并告诉它何时计算值。我们的功能的适当修复是
function sum(x) {
return function(y) {
if (!y) return x;
// ^
else return sum(x + y);
// ^^^
};
}
我知道可能没有任何理由使用它来代替其他创建可变参数函数的方法,但是在语义上是否可以定义一些东西来做到这一点?例如,它可以被称为 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
。什么会导致 return 一个字符串?当我更仔细地检查它时,它看起来像是 return 将函数的代码作为字符串,这对我来说毫无意义。也就是说,我对复杂 JavaScript 的语义并不十分熟悉,因此我可能会遗漏其中的一些重要概念。
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 认为您正在尝试连接,因此它在内部调用 Function
的 ToString
方法,该方法将函数体作为字符串提供。
因此,下次调用时,您调用的是字符串,因此出现错误,因为字符串不是函数。
Bergi 已经实现了正确的代码。
如评论中所述,x
是一个数字,sum(y)
是一个函数。在它们上使用 +
运算符使用它们的 gcd 类型,它们是字符串,无法调用。
您不能在 javascript 中柯里化运算符。您需要显式 return 柯里化函数,并告诉它何时计算值。我们的功能的适当修复是
function sum(x) {
return function(y) {
if (!y) return x;
// ^
else return sum(x + y);
// ^^^
};
}