6

これは、スカラでのフィボナッチ数の正確で有用な定義であると私が考えたものです。

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

圧縮されたものがストリームで正しく機能しないと思いますか? これを機能させる方法、またはこれが機能しない理由について何か提案はありますか?

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有限長のパフォーマンスが低下する可能性があります。(ほとんどのデータ構造は の効率的な実装をサポートしていないためです。)SeqListStreamtail


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

チケットは修正されずにクローズされましたが、Adriaan の「または、何か不足していますか?」に注意してください。コメントで — 多分これはいつか再訪されるでしょう.

于 2011-03-12T17:48:40.417 に答える