匹配列表

时间:2015-10-19 04:08:35

标签: list scala pattern-matching

val l = 1::2::Nil
l match{ case x :: y:: Nil => println(x,y)}

执行上述代码段时发生警告:

<console>:12: warning: match may not be exhaustive.
It would fail on the following inputs: List(_), List(_, _, _), Nil
       l match{ case x :: y:: Nil => println(x,y)}
       ^
(1,2)

但是,l match{ case List(x,y) => println(x,y)}效果很好。 为什么呢?

1 个答案:

答案 0 :(得分:3)

::是一个案例类(请参阅sources)。案例类具有自动检查详尽性(如果从密封特征或密封的抽象类继承),因此当您匹配::(x, ::(y, Nil))编译器时可以这样做。有关详细信息,请参阅this article(请记住,案例类不是ADT,但可以对其进行建模)。

List(a,b)只会导致从伴侣对象调用List.unapplySeq(请参阅8.1.1 Extractor Patterns),这意味着编译器无法进行额外检查,因为它(简单地说)只是转换{{ 1}}进入case List(a,b)来电。

以下是检查所有可能输入的总函数示例:

unapplySeq