2010-12-13 20 views
5

Bu kod parçasında sorun nedir?scala ya desen eşlemesi

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

neden desen eşleştirme sadece Sağa atlayıp Sol inceleyin değil?

+0

Derleyici, kodunuzun bazılarının ulaşılamayacağını size söylüyor. Bu iyi bir şey mi, evet? –

cevap

11

Kapalı yazım, Left("aoeu")'un Left[String,Nothing] olduğu sonucuna varılır. Açıkça yazmanız gerekiyor.

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

Model eşleştirme adaylarının her zaman eşleşen değere uyan türde olması gerekir.

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

Neden böyle davranıyor? Uyumsuz bir tipte eşleşmeye çalışmak için iyi bir neden olmadığını sanıyorum. Bunu yapmaya teşebbüs etmek, geliştiricinin gerçekten neyi amaçladığını yazmadığının bir işaretidir. Derleyici hatası, hataları önlemeye yardımcı olur.

+4

Anahtar noktanın önemsiz olduğunu düşünmüyorsun: Derleyici, kodun bir kısmının ulaşılamayacağını doğru bir şekilde işaret ediyordu. Evet, bu hatayı yenebilirsin ama yapmamalısın. – 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