Scala.Either orElse方法

MyT*_*tle 7 scala either

什么是Either在Scala中使用的惯用方法?例如,当使用时,Option我可以使用orElse方法获取当前的下一个可选值None.但是如何以Either同样的方式合作?我没有找到类似orElse 链接Either的方法(我知道有这样的方法并不是一个好主意,因为我们失去了Left价值)

编辑:实际上我有一系列if-elseif-elseif-else表达式,每个表达式返回RightLeft.我想重构我的代码,使其变得"更具功能性".所以,我可以取代它firstOption orElse secondOption orElse...,如果它是Option,但如何在这里使用Either

Jat*_*tin 10

那么对此进行了长时间的讨论.目前正如你所说的那样Either是公正的(即左和右被视为相同).因此,如果orElse被召唤,人们不知道该怎么办?做正确的偏见会解决问题(正如Tony Morris所说,这是一个错误)

所以一些黑客是:使用LeftProjection或RightProjection.右投影具有效用函数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)
Run Code Online (Sandbox Code Playgroud)

或者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)
Run Code Online (Sandbox Code Playgroud)

这样你就可以继续使用它作为monad.


更新:

Post Scala 2.12 Either是右偏的,这意味着它Right被认为是操作的默认情况.如果是Left,则操作mapflatMap返回Left值不变:

 def doubled(i: Int) = i * 2
 Right(42).map(doubled) // Right(84)
 Left(42).map(doubled)  // Left(42)
Run Code Online (Sandbox Code Playgroud)

您可以在Either API 上阅读更多信息.