使用流/无限列表的Scalas(a,b).zipped(或Tuple2.zipped)概念

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与流无法正常工作?关于如何使这项工作,或为什么这不(不应该?)工作的任何建议?

Ken*_*oom 8

以下工作正常

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不是一个ListStream.(因为大多数数据结构不支持有效的实现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)