2010-12-13 5 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 
Смежные вопросы