6

这是我认为 scala 中斐波那契数的正确且有用的定义:

lazy val fibs:Stream[Int] = 0 #:: 1 #:: (fibs,fibs.tail).zipped.map(_+_)

但是,我收到以下错误:

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...

我猜 zipped 不能与流一起正常工作?关于如何使这项工作的任何建议,或者为什么这不(不应该?)工作?

4

2 回答 2

8

以下工作正常

val fibs:Stream[Int] = 0 #:: 1 #:: (fibs zip fibs.tail).map{ case (a,b) => a+b }

问题Tuple2.zipped在于它假设它可以foreach在它正在压缩的序列上运行。这可能是设计使然,因为以实现它的方式做事Stream.zip可能会给您带来任何Seq不是 aList或的有限长度的糟糕性能Stream。(因为大多数数据结构不支持有效的实现tail。)


Stream.zip基本上实现如下(尽管它做了一些使类型更通用的东西)。

class Stream[A]{
  def zip(other:Stream[B]) =
    (this.head, other.head) #:: (this.tail zip other.tail)
}
于 2011-03-11T20:01:46.950 回答
3

在 Scala 的 Trac 数据库中有一张票:http: //lampsvn.epfl.ch/trac/scala/ticket/2634

票被关闭为 wontfix,但请注意 Adriaan 的“或者我们错过了什么?” 在评论中-也许有一天会重新讨论。

于 2011-03-12T17:48:40.417 回答