1

次のコードがあります

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の違いを理解していませんfoldfold

4

1 に答える 1