Either
是正确的偏向斯卡拉2.12,它允许它在没有投影的情况下用于for/yield块,就像Option
一样。但显然这与flatMap
一起使用时的行为不如Option
。在Scala中使用flatMap列表[任一]
object Main {
def main(args: Array[String]): Unit = {
val nums = List.range(1,10)
println(nums.flatMap(evenOption))
println(nums.flatMap(evenEither)) // fails
}
def evenOption(x: Int): Option[Int] = if (x % 2 == 0) Some(x) else None
def evenEither(x: Int): Either[String, Int] = if (x % 2 == 0) Right(x) else Left("not even")
}
我最小的范畴理论知识让我觉得Either
不是一个单子,所以这个不成?或者我怎么能让上面的例子工作?
该问题可能与以下事实有关:或者不扩展TraversableOnce? – Mikel