Лучшая проверка типов на совпадение в Scala - PullRequest
9 голосов
/ 02 августа 2010
scala> class A
defined class A

scala> class B
defined class B

scala> val a: A = new A
a: A = A@551510e8

scala> a match {
     | case _: B => println("unlikely")
     | case _ => println("no match")
     | }
no match

В приведенном выше примере не должен ли компилятор сказать мне, что один из случаев никогда не может совпадать? Несколько более сложный пример недавно обнаружил меня, что привело к тому, что компилятор обнаружил ненужную ошибку, которая должна была быть обнаружена.

Edit:

Просто чтобы прояснить вопрос. Разве это невозможно в Scala по какой-то причине, которую я не вижу? (Я могу понять, если типы использовали универсальные шаблоны, а удаление типов вызывало проблемы, но это выглядит довольно просто.) И если это не невозможно, есть ли законные причины, которых нет в Scala? Если нет, то когда он будет добавлен? ;)

Ответы [ 2 ]

22 голосов
/ 02 августа 2010

В настоящее время проверка полноты и избыточности выполняется только для шаблонов конструктора класса дел. В принципе, компилятор может сделать это и для некоторых других типов шаблонов. Но в SLS должно быть указано, какие именно тесты проводятся. Это выглядит выполнимо, но нетривиально, учитывая взаимодействие между различными классами паттернов. Итак, в целом, это одна из областей в Scala, которая будет получать выгоду от дальнейших взносов.

4 голосов
/ 02 августа 2010

Компилятор предупреждает вас (на самом деле компиляция заканчивается неудачей), если вы используете case-классы:

scala> case class A()
defined class A

scala> case class B()
defined class B

scala> val a = A()
a: A = A()

scala> a match {
     | case A() => println("A")
     | case B() => println("B")
     | case _ => println("_")
     | }
<console>:13: error: constructor cannot be instantiated to expected type;
 found   : B
 required: A
       case B() => println("B")
...