5

FS2 に慣れようとしているときに、Scala コレクションの Stream を使用した気の利いた再帰的な実装に出会い、FS2 で試してみたいと思いました。

  import fs2.{Pure, Stream}
  val fibs: Stream[Pure, Int] = Stream[Pure, Int](0) ++ fibs.fold[Int](1)(_ + _)
  println(fibs take 10 toList) // This will hang

これが FS2 でハングする理由は何ですか? また、同様の機能するソリューションを取得する最善の方法は何ですか?

4

1 に答える 1

8

あなたの問題はStream.fold、ストリームのすべての要素を消費し、フォールドから単一の最終値を生成することです。1 つの要素のみを放出することに注意してください。

再帰ストリームは、10 個の要素が発行されたときにのみ終了します (これは によって指定されますtake 10)。このストリームは十分に生産的ではないため、fold停止することなく値を追加し続けます。

これを修正する最も簡単な方法は、フォールドから部分的な結果を発行するコンビネータを使用することです。これはscan

また、FS2 はこのコードのほとんどの型を推測できるため、必ずしも多くの型注釈は必要ありません。

次の実装は正常に機能するはずです。

import fs2.{Pure, Stream}
val fibs: Stream[Pure, Int] = Stream(0) ++ fibs.scan(1)(_ + _)
println(fibs take 10 toList)
于 2016-09-09T17:38:26.480 に答える