在尝试熟悉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
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
438 次 |
| 最近记录: |