在尝试熟悉 FS2 时,我遇到了一个使用 Scala 集合的 Stream 的 nifty recursive implementation,并认为我可以在 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 中挂起的原因是什么,获得类似的工作解决方案的最佳方法是什么?

最佳答案

您的问题是 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)

关于scala - 如何使用 FS2 在 Scala 中实现递归斐波那契数列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39416841/

10-13 08:19