我試圖理解foldM
的Foldable
在cats
嘗試一個簡單的例子:假設我需要總結列表中的數字,而運行總和爲正值時打破,否則打破。如何使用foldM的摺疊?
val sumUp: (Int, Int) => Option[Int] = (x, y) => {
println(s"x = $x, y = $y")
val sum = x + y
if (sum > 0) Some(sum) else None
}
scala> val xs = List(1, 2, 3, -2, -5, 1, 2, 3)
xs: List[Int] = List(1, 2, 3, -2, -5, 1, 2, 3)
scala> Foldable[Stream].foldM(xs.toStream, 0)(sumUp)
x = 0, y = 1
x = 1, y = 2
x = 3, y = 3
x = 6, y = -2
x = 4, y = -5
res27: Option[Int] = None
現在我需要編寫新功能sumUp2
獲得輸入流尾,開始所述運行總和變成< = 0和foldM
休息。例如,我需要這樣的:
scala> val tail = Foldable[Stream].foldM(xs.toStream, 0)(sumUp2)
tail: Stream[Int] = Stream(-5, ?)
scala>tail.toList
res28: List[Int] = List(-5, 1, 2, 3)
如何寫sumUp2
?
不幸的是''sumUp2'被調用了'xs'的_all_元素,但是我想在運行總和<= 0時停止調用函數。無論如何,謝謝。 – Michael