ADT 上的 Scala 模式匹配可能不会警告无法访问的代码



我有一个简单的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"
}

这按预期工作。现在我已经在上述函数中匹配了交通灯的所有情况。如果我在同一方法的底部引入默认匹配:

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 无法推断我已经覆盖了交通灯 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

这是一个错误还是我做了错误的假设?

您没有涵盖所有可能的变体TrafficLight您只是涵盖了所有命名变体,但您仍然可以将匿名类对象作为参数 fe 传递:

getColour(new TrafficLight {})

相关内容

最新更新