2014-06-05 13 views
6

Załóżmy, że mam następujący kod:Scala albo ze krotki jako prawa

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

Kiedy ją oceniać w REPL uzyskać

: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 ^

Dlaczego mam taki błąd? Nie mogę dopasować wzorca na krotce z prawej strony?

Odpowiedz

5

Problem wydaje się być błędem scala https://issues.scala-lang.org/browse/SI-7222. Konwertowanie wyrażenia dla zrozumienia na mapę płaską/mapę wydaje się działać.

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

Używam scala 2.10.3. Również dlaczego ma taki dziwny typ: 'Serializable z Product with scala.util.Either [String, Int]'? Dlaczego nie po prostu 'scala.util.Either [String, Int]' – maks