次のコードがあります
val listOption: List[Option[Int]] = List(1.some, none, 2.some)
要素を折りたたみたい、次のコードを書く
val result = listx.fold(0.some)((acc, el) => {
(acc, el) match {
case (Some(a), Some(b)) => Some(a + b)
case (Some(a), _) => Some(a)
case (_, Some(b)) => Some(b)
case _ => el
}
})
println(result.getOrElse(0)) // => 3
これは問題なく動作しますが、scalaz のソースに次のトリックが表示されます
val composeFold = Foldable[List] compose Foldable[Option]
composeFold.fold(listOption) // => 3
しかし、私はそれがどのように正しく機能するのか、なぜscalazがこのメソッドをインスタンスに混在させないのか、そしてscalaとscalazlistOption
の違いを理解していませんfold
fold