Лучше введите начинающее работу соответствие в Scala

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

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

Править:

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

9
задан Dave 2 August 2010 в 15:30
поделиться

2 ответа

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

22
ответ дан 4 December 2019 в 08:14
поделиться

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

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")
4
ответ дан 4 December 2019 в 08:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: