我有一个简单的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
这是错误还是我做错了假设?
答案 0 :(得分:2)
您并未涵盖TrafficLight
的所有可能的变体,只是涵盖了所有命名的变体,但是您仍然可以将匿名类对象作为参数fe传递。
getColour(new TrafficLight {})