Соответствие шаблону Scala в ADT может не предупреждать о недоступном коде - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть простой ADT (алгебраический тип данных), закодированный как:

sealed trait TrafficLight
case object Red extends TrafficLight
case object Green extends TrafficLight
case object Yellow extends TrafficLight

Скажем, у меня есть функция, которая возвращает название цвета светофора:

  def getColour(tf: TrafficLight): String = tf match {
    case Red    => "red"
    case Green  => "green"
    case Yellow => "yellow"
  }

Это работает как ожидалось. Теперь я сопоставил все случаи TrafficLight в вышеуказанной функции. Если я введу совпадение по умолчанию внизу того же метода:

  def getColour(tf: TrafficLight): String = tf match {
    case Red    => "red"
    case Green  => "green"
    case Yellow => "yellow"
    case other  => "unknown" //this should not be unreachable
  }

компилятор не предупреждает меня, что case other недоступен. Я также включил флаг компилятора: -Ywarn-dead-code. Значит ли это, что Scala не может сделать вывод, что я охватил все возможные значения TrafficLight ADT?

Это кажется маловероятным, потому что если я изменю определение getColour на:

def blah(tf: TrafficLight): String = tf match {
  case Red    => "red"
  case Green  => "green"
}

компилятор предупреждает меня, что я пропустил дело:

> match may not be exhaustive.
> [error] It would fail on the following input: Yellow
> [error]   def blah(tf: TrafficLight): String = tf match {

Я использую Scala 2.12.5

Это ошибка или я сделал неверное предположение?

1 Ответ

0 голосов
/ 04 сентября 2018

Вы не охватили все возможные варианты TrafficLight, вы просто охватили все именованные варианты, но вы все равно можете передать объект анонимного класса в качестве аргумента fe.:

getColour(new TrafficLight {})
...