首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala.Either orElse方法

Scala.Either orElse方法
EN

Stack Overflow用户
提问于 2013-08-21 08:09:36
回答 3查看 5.3K关注 0票数 7

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-21 08:25:17

在这个问题上有一个很长的讨论。目前,正如您所说的,Either是无偏的(即左和右被视为相同)。因此,如果调用orElse,人们就不知道该怎么办?纠正错误会解决问题(正如托尼·莫里斯所说,这是一个错误)

因此,一些黑客是:使用LeftProjection或RightProjection。右投影有实用函数map、flatMap、filter等)

代码语言:javascript
复制
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).另一个解决方案是建议的这里

代码语言:javascript
复制
object Implicits {
    implicit def rightBiasEither[A, B](e: Either[A, B]): Either.RightProjection[A, B] = e.right
  }

import Implicits._
a.getOrElse(b).getOrElse(c)

这样你就可以把它当作单曲继续使用。

更新

Post Scala 2.12,Either是偏右的,这意味着Right被认为是操作的默认情况。如果是Left,则像mapflatMap这样的操作将返回未更改的Left值:

代码语言:javascript
复制
 def doubled(i: Int) = i * 2
 Right(42).map(doubled) // Right(84)
 Left(42).map(doubled)  // Left(42)

您可以阅读更多关于任一 API的内容。

票数 10
EN

Stack Overflow用户

发布于 2019-03-28 20:05:41

启动Scala 2.13时,Either#orElse已经可用(在EitherScala 2.12中被右偏后):

代码语言:javascript
复制
Right(1) orElse Left(2) // Right(1)
Left(1) orElse Left(2)  // Left(2)
Left(1) orElse Left(2) orElse Right(3) // Right(3)
票数 4
EN

Stack Overflow用户

发布于 2018-03-11 04:54:13

最接近的:

代码语言:javascript
复制
Left(1).left.flatMap(_=>Left(2)).left.flatMap(_=>Left(3))
res22: Either[Int, Nothing] = Left(3)

Right(1).left.flatMap(_=>Left(2)).left.flatMap(_=>Left(3))
res23: Either[Int, Int] = Right(1)

如果您正在处理Try,请使用Throwable

代码语言:javascript
复制
either1.toTry orElse either2.toTry

是的,在我看来,缺乏orElse是不一致的,因为Either现在在2.12是正确的,并且有getOrElse方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18352079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档