我想为ZIO添加一个abort-early-in-a-fold的答案。
所以我采用了猫的解决方案:cats solution
def sumEvenNumbers(nums: Stream[Int]): Option[Long] = {
import cats.implicits._
nums.foldM(0L) {
case (acc, c) if c % 2 == 0 => Some(acc + c)
case _ => None
}
}
ZIO如何做到这一点?
我得到的最接近的:
new DefaultRuntime {}
.unsafeRun(sumEvenNumbers(List(2,4,6,3,5,6)))
def sumEvenNumbers(nums: Iterable[Int]): ZIO[Any, Nothing, Int] = {
stream.Stream.fromIterable(nums)
.run(Sink.fold(0)(s => s % 2 == 0) { (a: Int, b: Int) => (a + b, Chunk.empty)
})
}
但这给了我:15
而不是12
. 所以它似乎短路了,但它需要的数量太多了。它是一个Int
not Option[Int]
。