7

次のコードがあるとします。

val either: Either[String, (Int, Int)] = Right((1,2))
for {
  (a, b) <- either.right
} yield a + b

REPLで評価すると、

:13: エラー: コンストラクターを期待される型にインスタンス化できません。見つかった: (T1, T2) 必要: scala.util.Either[Nothing,(Double, Double)] (a, b) <- a.right ^ :14: エラー: 見つかりません: 値 a } yield a + b ^

なぜこのようなエラーが発生するのですか? どちらかの権利からのタプルでパターン マッチを行うことはできませんか?

4

1 に答える 1

7

問題は scala バグのようですhttps://issues.scala-lang.org/browse/SI-7222。for 内包表記を flatMap/map 表記に変換するとうまくいくようです。

val either: Either[String, (Int, Int)] = Right((1, 2))
either.right.map {
  case (a, b) =>
    a + b
}

either: Either[String,(Int, Int)] = Right((1,2))
res0: Serializable with Product with scala.util.Either[String,Int] = Right(3)
于 2014-06-05T17:51:28.513 に答える