2010-12-13 37 views
5

quel est le problème dans ce morceau de code?scala soit le motif correspond

(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]  

pourquoi le modèle matcher ne sautez pas le droit et gauche examiner?

+0

Um, le compilateur vous dit qu'une partie de votre code est inaccessible. C'est une bonne chose, oui? –

Répondre

11

Le typage implicite implique que Left("aoeu") est un Left[String,Nothing]. Vous devez le taper explicitement. Il semble que les candidats qui correspondent à un modèle doivent toujours être d'un type correspondant à la valeur correspondant.

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") => ; 
      ^

Pourquoi se comporte-t-il comme ceci? Je soupçonne qu'il n'y a pas de bonne raison de tenter de faire correspondre un type incompatible. Tenter de le faire est un signe que le développeur n'écrit pas ce qu'il a vraiment l'intention de faire. L'erreur du compilateur permet d'éviter les bogues.

+4

Je pense que vous avez sous-estimé le point clé: le compilateur soulignait correctement qu'une partie du code était inaccessible. Oui, vous pouvez vaincre cette erreur, mais vous ne devriez pas. – 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