在自豪的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
该类仅需要完整的尾巴?
你想要的是def x: Stream[Int] = 2 #:: x
。这产生一个immutable.Stream[Int]
。
仅在需要时才对惰性变量进行评估,但会对其进行全面评估。一Stream
,在另一方面,是懒惰的值的集合。每个元素仅在需要时才被评估,但是整个集合可能永远都不会被评估,这就是为什么它可以无限的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句