2016-09-09 9 views
2

はFS2に精通しようと、私はScalaのコレクションストリームを使用してnifty recursive implementationに出くわした、と私はFS2でそれをしようで行くを持っているだろうと思っている間:FS2を使用してScalaで再帰的なフィボナッチシーケンスを実装する方法は?

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

あなたの問題は、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) 
+0

うわは、実際にスキャンをしようとして始めたが、いくつかの構文上の問題を持っていた折りに切り替え。少なくとも私は折りたたみとスキャンの違いを学んだ... – bbarker

+0

機能的にunadeptの詳細情報:http://stackoverflow.com/a/17408881/3096687 – bbarker

関連する問題