【发布时间】:2015-05-05 02:47:52
【问题描述】:
我刚刚写了这个函数,想知道如果我省略了 Nil 情况会发生什么,并注意到 scalac 给了我一个警告:
def printList[String](list: List[String]) {
list match {
case head :: tail => {
println(head)
printList(tail)
}
//case Nil => println("Done")
}
}
Warning: match may not be exhaustive.
It would fail on the following input: Nil
我无法准确确定这里发生了什么。在你用尽案例之前,我对递归数据类型的模式匹配有一个大致的了解,但我不清楚它是如何映射到 Scala 类型系统的。具体来说,我正在查看 Scala 标准库的源代码并想知道:
- Scala 究竟在代码中的什么地方得到了一个基本情况需要完成 List 类实例的匹配语句的想法?我们当然可以想象一种代数数据类型,在没有基本情况的情况下“继续运行”。
- scala.collection.immutable.Nil 究竟在代码中的什么位置被指定为 List 类的基本情况?
【问题讨论】:
-
Scala 类型匹配实现的血腥细节在这里:lampwww.epfl.ch/~emir/written/…
-
对于
Nil,这与“基本情况”无关。List是密封的,因此编译器知道要在匹配中查找哪些类型,即::和Nil。当其中一个缺失时,这是一个相当好的暗示,它不是一个详尽的匹配。
标签: scala type-systems algebraic-data-types