我看到this answer這個片段哈斯克爾通過proud haskeller對元PPCG:「等一下,我能做到這一點在斯卡拉」爲什麼遞歸懶惰列表在Scala中打擊堆棧?
x=2:x
我想,所以,我想:
lazy val x: List[Int] = 2 :: x
它編譯,我的控制檯打印一個不錯的x: List[Int] = <lazy>
。但是這些線導致StackOverflowException
的:
x take 1
x.head
x(1)
x
基於最後一個,它看起來像任何企圖利用x
吹堆棧試圖計算x
(可能是或堆棧溢出偏偏試圖打印在控制檯中)。在這個例子中,斯卡拉的懶惰與哈斯克爾的懶惰有什麼不同?這是Scala的lazy val
的一個特性還是List
類只需要一個完整的尾巴?
不是,你需要它的返回類型來編譯,但仍然不錯。對於懶惰的vals,它是'lazy val x:Stream [Int] = 2#:: x'。 –
@BrianMcCutchon,對吧。忙於撰寫第二段,錯過了。然而,我會爭辯說,使'Stream'val懶惰是沒有意義的。如果它是'val',那麼記錄結果(被評估的元素)。如果它是'var',他們不是。讓它成爲一個「懶惰的val」並不會給你帶來太多的收益。 – jwvh
糟糕。另一個錯誤嘗試澄清'被記憶的'val'流和'未被記憶的'def'(而不是'var')流之間的區別。 – jwvh