2010-12-13 41 views
5

このコードは何が問題なのですか?パターンマッチはちょうどをスキップし、左を検討しない理由scalaパターン一致

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

+0

あなたのコードの一部が到達不能であることをコンパイラから伝えています。それはいいことです、はい? –

答えて

11

暗黙の型指定は、Left("aoeu")Left[String,Nothing]であると推定しています。明示的に入力する必要があります。

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

パターンマッチング候補は、常に一致する値に一致するタイプである必要があります。

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

なぜこのように動作しますか?私は、互換性のない型にマッチさせようとする正当な理由はないと思う。そうしようとするのは、開発者が本当に意図していることを書いていないという兆候です。コンパイラエラーは、バグを防ぐのに役立ちます。

+4

私はあなたが重要な点を強調していないと思います。コンパイラは、コードの一部が到達不能であったことを正しく指摘していました。はい、あなたはそのエラーを打ち負かすことができますが、そうしてはいけません。 – 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 
関連する問題