【发布时间】:2013-06-26 19:44:56
【问题描述】:
我之前问过a question,关于在 Scala 中使用惰性求值。我试图在 Scala 中编写以下 Haskell 函数:
fib a b = c : (fib b c)
where c = a+b
这个问题的答案是我不能使用 Lists,而应该使用 Streams。现在我正在尝试在 Javascript 中做同样的事情。我翻译了函数,在this site上试了一下:
function fib(a,b) {
c = a+b;
return [c] + fib(b,c);
}
var res = fib(0,1).slice(0,10);
console.log(res);
但我收到以下错误:
RangeError: Maximum call stack size exceeded
Javascript 有办法做到这一点吗?
【问题讨论】:
-
结束条件在哪里?
-
您的递归没有退出条件。
-
想法是这个例子中的10个数字之后,列表将不再被评估。
-
我现在开始明白
slice()不会那样做。 -
@RobertHarvey 确实如此。您的链接对 OP 非常有帮助。我只是在解释为什么在题为“惰性评估”的问题中,OP 故意不包含递归的退出条件。在发表评论时,您似乎忽略了惰性评估方面。也许在说明退出条件的需要之前明确的“javascript没有延迟评估”会更清楚。
标签: javascript haskell lazy-evaluation