我在 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/