javascript中是否有类似的构造?
是的,你可以把它翻译成 JS:
function power_acc(x, y) { // Double -> Int -> Double
y = y>>>0; // cast to positive int (avoiding nontermination)
return power_acc_h(x, y, 1);
}
function power_acc_h(x, y, acc) { // Double -> Int -> Double -> Double
return y == 0
? acc
: power_acc_h(x, y-1, acc*x);
}
还是因为 javascript 的功能不如 Haskell,所以它在效率方面是否有意义?
使用 ES6,JS 完全支持尾递归,并且您将获得与循环相同的效率(甚至可能比 haskell 更好,因为您不会创建惰性乘法)。
有没有像 ramda、lodash 等支持这种编程方式的库
不需要图书馆。尽管我确信有一些库可以简化类型检查或为模式匹配提供更好的符号。
例如,您将如何用 javascript 编写此代码?
你会使用一个while
循环。haskell 中的所有累加函数都是这样写的,因为它们可以直接优化成一个循环,这就是你应该在 JS 中使用这个构造的符号(因为大多数程序员都熟悉它):
function power_acc(x, y) { // Double -> Int -> Double
y = y>>>0; // cast to positive int (avoiding nontermination)
var acc = 1;
while (y != 0) {
acc *= x;
y -= 1;
}
return acc;
}
改变局部变量并没有什么坏处,你的函数仍然是纯粹的。如果您正在寻找更短的符号,请使用for
循环。