好吧,对此进行了很长时间的讨论。目前正如你所说Either
的是无偏见的(即左和右被视为相同)。orElse
因此,如果被调用,不知道该怎么办?让它偏向正确会解决问题(正如托尼莫里斯所说,这是一个错误)
所以一些技巧是:使用 LeftProjection 或 RightProjection。Right Projection具有实用功能 map、flatMap、filter 等)
val a:Either[String, Int]
val b:Either[String, Int]
for{
x <- a.right //returns a RightProjection of a
y <- b.right
} yield (a,b)
或a.right.getOrElse(b.right)
。此处建议的另一种解决方案是:
object Implicits {
implicit def rightBiasEither[A, B](e: Either[A, B]): Either.RightProjection[A, B] = e.right
}
import Implicits._
a.getOrElse(b).getOrElse(c)
这样你就可以继续使用它作为 monad。
更新:
Post Scala 2.12Either
是右偏的,这意味着它Right
被假定为默认情况下进行操作。如果是Left
,则类似map
和的操作flatMap
返回Left
不变的值:
def doubled(i: Int) = i * 2
Right(42).map(doubled) // Right(84)
Left(42).map(doubled) // Left(42)
您可以阅读有关Either API 的更多信息。