Следующее работает правильно
val fibs:Stream[Int] = 0 #:: 1 #:: (fibs zip fibs.tail).map{ case (a,b) => a+b }
Проблема с 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)
}