2010-12-13 15 views
5

¿Qué hay de malo en este fragmento de código?scala cualquiera coincide con el patrón

(Left("aoeu")) match{case Right(x) => ; case Left(x) => }
<console>:6: error: constructor cannot be instantiated to expected type; 
found : Right[A,B] 
required: Left[java.lang.String,Nothing]  

por qué el comparador de patrón simplemente no se salte el derecho y el izquierdo a examinar?

+0

Um, el compilador le dice que parte de su código es inalcanzable. Eso es algo bueno, ¿sí? –

Respuesta

11

La tipificación implícita está infiriendo que Left("aoeu") es Left[String,Nothing]. Necesitas escribirlo explícitamente.

(Left("aoeu"): Either[String,String]) match{case Right(x) => ; case Left(x) => } 

Parece que los candidatos de coincidencia de patrones siempre deben ser de un tipo que coincida con el valor que se busca.

scala> case class X(a: String) 
defined class X 

scala> case class Y(a: String) 
defined class Y 

scala> X("hi") match { 
    | case Y("hi") => ; 
    | case X("hi") => ; 
    | } 
<console>:11: error: constructor cannot be instantiated to expected type; 
found : Y 
required: X 
     case Y("hi") => ; 
      ^

Por qué se comporta así? Sospecho que no hay una buena razón para intentar hacer coincidir un tipo incompatible. Intentar hacerlo es una señal de que el desarrollador no está escribiendo lo que realmente pretende. El error del compilador ayuda a prevenir errores.

+4

Creo que subestimó el punto clave: el compilador señalaba correctamente que una parte del código era inalcanzable. Sí, puedes vencer ese error, pero no deberías. – Malvolio

3
scala> val left: Either[String, String] = Left("foo") 
left: Either[String,String] = Left(foo) 

scala> left match { 
    | case Right(x) => "right " + x 
    | case Left(x) => "left " + x } 
res3: java.lang.String = left foo 
Cuestiones relacionadas