在 Scala 中使用 Either 的惯用方法是什么?例如,当使用Option时,如果current是orElse,则可以使用None方法获取下一个可选值。但是如何以同样的方式使用 Either 呢?我没有找到像 orElse 这样的方法来链接任何一个(我知道拥有这样的方法不是一个好主意,因为我们丢失了 Left 值)

编辑: 事实上,我有一系列 if-elseif-elseif-else 表达式,每个表达式都返回 RightLeft 。我想重构我的代码,使其变得“更实用”。所以我可以用 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,则像mapflatMap之类的操作将返回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/

10-12 19:44