在 Scala 中使用 Either
的惯用方法是什么?例如,当使用Option
时,如果current是orElse
,则可以使用None
方法获取下一个可选值。但是如何以同样的方式使用 Either
呢?我没有找到像 orElse
这样的方法来链接任何一个(我知道拥有这样的方法不是一个好主意,因为我们丢失了 Left
值)
编辑: 事实上,我有一系列 if-elseif-elseif-else
表达式,每个表达式都返回 Right
或 Left
。我想重构我的代码,使其变得“更实用”。所以我可以用 firstOption orElse secondOption orElse...
替换它,如果它是 Option
,但是如何在这里使用 Either
?
最佳答案
好吧,这已经有很长的discussion了。目前,正如您所说的,Either
是无偏的(即,将Left和Right视为相同)。因此,如果不调用orElse
,该怎么办?将其设置为正确的偏斜就可以解决问题(就像Tony Morris所说的那样,这是一个错误)
因此,一些技巧是:使用LeftProjection或RightProjection。 Right Projection具有实用程序功能映射,flatMap,过滤器等)
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)
。如建议的另一种解决方案here: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。
更新:
在Scala 2.12之后,
Either
是右偏的,这意味着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上阅读更多内容。
关于Scala.Either orElse 方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18352079/