Scala либо образец соответствия - PullRequest
7 голосов
/ 13 декабря 2010

что не так в этом куске кода?

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

почему средство сопоставления с образцом просто не пропускает правое и проверяет левое?

Ответы [ 2 ]

12 голосов
/ 13 декабря 2010

Неявная типизация подразумевает, что 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 голосов
/ 13 декабря 2010
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
...