2014-06-05 5 views
6

Angenommen, ich habe folgenden Code:Scala entweder mit Tupel als rechten

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

Als ich bewerten es in REPL ich

:13: error: constructor cannot be instantiated to expected type; found : (T1, T2) required: scala.util.Either[Nothing,(Double, Double)] (a, b) <- a.right ^:14: error: not found: value a } yield a + b ^

Warum ich solche Fehler haben? Kann ich kein Muster auf Tupel von Entweder Richtig pattern?

Antwort

5

Problem scheint ein Scala Bug zu sein https://issues.scala-lang.org/browse/SI-7222. Konvertieren der für Verständnis zu Flatmap/Map Notation scheint zu funktionieren.

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) 
+0

Ich bin mit scala 2.10.3. Auch warum hat es einen so seltsamen Typ: 'Serializable mit Produkt mit scala.util.Either [String, Int]'? Warum nicht einfach "scala.util.Either [String, Int]" – maks

Verwandte Themen