web-dev-qa-db-ja.com

どちらかの価値を得る

matchを使用する以外に、getOrElseまたはRight値の実際の内容をLeftにするオプションのような方法はありますか?

scala> val x: Either[String,Int] = Right(5)
scala> val a: String = x match { 
                                case Right(x) => x.toString
                                case Left(x) => "left" 
                       }
a: String = 5
21
Kevin Meredith

私は特にEitherが好きではないので、あまり詳しくありませんが、予測を探していると思います:either.left.getOrElseまたはeither.right.getOrElse

射影はfor内包でも使用できることに注意してください。これはドキュメンテーションからの直接の例です:

def interactWithDB(x: Query): Either[Exception, Result] =
  try {
    Right(getResultFromDatabase(x))
  } catch {
    case ex => Left(ex)
  }

// this will only be executed if interactWithDB returns a Right
val report =
  for (r <- interactWithDB(someQuery).right) yield generateReport(r)
if (report.isRight)
  send(report)
else
  log("report not generated, reason was " + report.left.get)
16
Nicolas Rinaudo

getOrElseまたはleftプロジェクションでrightを呼び出すことに関するNicolas Rinaudoの回答は、おそらく_Option.getOrElse_に最も近いものです。

または、次のいずれかをfoldできます。

_scala> val x: Either[String,Int] = Right(5)
x: Either[String,Int] = Right(5)

scala> val a: String = x.fold(l => "left", r => r.toString)
a: String = 5
_

上記のフォールドではlが使用されていないため、x.fold(_ => "left", r => r.toString)と書くこともできます

編集:実際には、どちらかのtoOptionまたはleftプロジェクションでrightを呼び出すことにより、文字通り_Option.getOrElse_を使用できます。たとえば、

_scala> val o: Option[Int] = x.right.toOption
o: Option[Int] = Some(5)

scala> val a: String = o.map(_.toString).getOrElse("left")
a: String = 5
_
15

両側にAが指定されている、つまりEither[A, A]、使用できます Either.merge

...左か右かに関係なく、どちらかのインスタンスから値を抽出します。

左と右の型が異なる場合、結果はAnyになります:

val e: Either[Int, String] = Right("hello")
e.merge // hello: Any
2
Mario Galic

Scala 2.12では、「右」の値を取得するためのgetOrElseメソッドがありますが、「左」の値に直接使用することはできません。ただし、次のように行うことができます。 : e.swap.getOrElse(42)

1
lex82