Bri*_*hon 2 haskell scala linked-list lazy-evaluation
我看到了Haskell这个片段在此答案由自豪haskeller上元PPCG:
x=2:x
Run Code Online (Sandbox Code Playgroud)
我想,"等等,我可以在Scala那样做!" 所以我尝试过:
lazy val x: List[Int] = 2 :: x
Run Code Online (Sandbox Code Playgroud)
它编译了,我的控制台打印好了x: List[Int] = <lazy>.但是这些行中的每一行都会导致StackOverflowException:
x take 1
x.head
x(1)
x
Run Code Online (Sandbox Code Playgroud)
基于最后一个,它看起来像任何尝试使用x打击堆栈尝试计算x(或者尝试在控制台中打印它时发生堆栈溢出).在这个例子中,Scala的懒惰与Haskell的懒惰有什么不同?这是Scala的功能lazy val还是List只需要完整的尾部?
jwv*_*wvh 10
你想要的是什么def x: Stream[Int] = 2 #:: x.这产生了一个immutable.Stream[Int].
仅在需要时评估惰性变量,但它是完全评估的.一Stream,在另一方面,是懒惰的值的集合.每个元素仅在需要时进行评估,但可能永远不会评估整个集合,这就是为什么它可以是无限的.