Fel*_*lix 6 scala list stream fibonacci infinite
这里是我认为scala中斐波那契的正确和有用的定义:
lazy val fibs:Stream[Int] = 0 #:: 1 #:: (fibs,fibs.tail).zipped.map(_+_)
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
fibs take 10 foreach println
0
1
java.lang.StackOverflowError
at scala.collection.mutable.LazyBuilder.(LazyBuilder.scala:25)
at scala.collection.immutable.Stream$StreamBuilder.(Stream.scala:492)
at scala.collection.immutable.Stream$.newBuilder(Stream.scala:483)
at...
Run Code Online (Sandbox Code Playgroud)
我猜zipped与流无法正常工作?关于如何使这项工作,或为什么这不(不应该?)工作的任何建议?
以下工作正常
val fibs:Stream[Int] = 0 #:: 1 #:: (fibs zip fibs.tail).map{ case (a,b) => a+b }
Run Code Online (Sandbox Code Playgroud)
问题Tuple2.zipped在于它假设它可以foreach在序列上运行.这可能是由设计,因为这样做事情的方式Stream.zip实现它可能会给你坏的表现对于任何有限长度Seq不是一个List或Stream.(因为大多数数据结构不支持有效的实现tail.)
Stream.zip 本质上实现如下(虽然它做了一些东西,使类型更通用).
class Stream[A]{
def zip(other:Stream[B]) =
(this.head, other.head) #:: (this.tail zip other.tail)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
534 次 |
| 最近记录: |