为什么递归的惰性列表会在Scala中破坏堆栈?

布莱恩·麦卡顿

自豪的Haskeller在Meta PPCG上的回答中我看到了Haskell的摘要:

x=2:x

我以为,“等等,我可以在Scala中做到这一点!” 所以我尝试了:

lazy val x: List[Int] = 2 :: x

它编译好了,我的控制台打印了一个漂亮的x: List[Int] = <lazy>但是这些行中的每一个都会导致StackOverflowException

x take 1
x.head
x(1)
x

根据最后一个,看起来任何尝试使用都会x破坏堆栈以尝试进行计算x(尝试在控制台中打印堆栈或发生堆栈溢出)。在此示例中,Scala的惰性与Haskell的惰性有何不同?这是Scala的功能,lazy val还是List该类仅需要完整的尾巴?

w

你想要的是def x: Stream[Int] = 2 #:: x这产生一个immutable.Stream[Int]

仅在需要时才对惰性变量进行评估,但会对其进行全面评估。Stream,在另一方面,是懒惰的值的集合。每个元素仅在需要时才被评估,但是整个集合可能永远都不会被评估,这就是为什么它可以无限的原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么异步递归会在浏览器中显示调用堆栈?

使用惰性val的Scala线性化,为什么要无限递归?

为什么 return 语句不会破坏 Javascript 中的递归 for 循环

为什么惰性属性和 didSet 会以递归调用结束?

为什么scala不允许在特征中定义惰性值?

为什么新的Promise的reject()会在可怕的“未捕获(承诺)”错误中丢失堆栈跟踪

为什么这个(部分)MergeSort实现会破坏堆栈?

为什么递归会覆盖传递的列表中的值?

为什么函数会在python 3中返回自身的最大出递归

为什么Javascript中的递归异步函数会导致堆栈溢出?

为什么此尾部递归循环会导致javascript / node中的堆栈溢出?

为什么我在C中的递归函数会导致堆栈溢出?

为什么我在 Python 中的递归骑士代码只运行第一个堆栈?

在 Scala 中合并两个惰性列表

如果在类内的构造函数<2中启动了空array [],为什么检测到堆栈破坏

Scala中传递惰性参数有什么帮助吗?

Scala中的惰性val的作用域规则是什么?

为什么这样的递归不会导致堆栈溢出?

为什么在迭代过程中需要使用&来破坏元组列表?

为什么scala会在Future中挂起评估一个按名称的参数?

为什么ls -R称为“递归”列表?

为什么++ =在Scala中不能使用相同的列表?

当我在quicksort算法中的递归调用中包含枢轴时,为什么会出现堆栈溢出?

为什么加载惰性集合

Scala:为什么类型转换隐式破坏代码

为什么默认值不会在 Mat Select 下拉列表中呈现?

为什么追加到列表会在Python中引发NoneType错误?

为什么我会在 Python 的字典和列表中得到重复的键?

为什么基于堆栈的迭代并不比 C 中的递归更好?(以斐波那契数为例)