我在Meta PPCG上看到了这篇答案,由proud haskeller编写的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
类只需要一个完整的尾部?
lazy val x: Stream[Int] = 2 #:: x
。 - Brian McCutchonval
流和被记忆的def
(而不是var
)流之间的区别。 - jwvh