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

标签 scala haskell linked-list lazy-evaluation

我在 this answer 中看到了这个 Haskell 片段来自 proud haskeller在元 PPCG 上:

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类只需要一个完整的尾部?

最佳答案

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

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

关于scala - 为什么递归惰性列表会破坏 Scala 中的堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43534944/

相关文章:

haskell - -XStrict 在 GHC 中有什么作用吗?

C链表节点未添加

algorithm - 使用 Hare 和 Tortoise 方法在链表中进行循环检测

c - 数据结构如何在堆上组织

scala - java.lang.NoSuchMethodError : scala. Predef$.refArrayOps 在 Spark 作业中使用 Scala

IntelliJ Idea Maven 项目中 Scala 模块的 Scala 签名错误

haskell - 具有惰性评估和内存消耗的蛮力

haskell - 使用模板 Haskell 生成 TExp

sql - 斯卡拉 Spark : Parse SQL string to Column

java - 将 TypedType[Set[MyObject]] 烫到 TypedType[MyObject]