如何使用FS2在Scala中实现递归Fibonacci序列?

时间:2016-09-09 17:27:06

标签: scala stream fs2

在尝试熟悉FS2时,我遇到了nifty recursive implementation使用Scala集合'流,并且我想在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中出现这种情况的原因是什么,以及获得类似工作解决方案的最佳方式是什么?

1 个答案:

答案 0 :(得分:6)

您的问题是Stream.fold消耗了流的所有元素,从折叠中生成一个最终值。请注意,它只发出一个元素。

递归流仅在发出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)