У меня есть простой 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
Это ошибка или я сделал неверное предположение?