Scala类型系统如何知道Nil是穷举的?
我刚写了这个函数,想知道如果我省略了Nil的情况会发生什么,并注意到
scalac给了我一个警告:
def printList[String](list: List[String]) { list match { case head :: tail => { println(head) printList(tail) } //case Nil => println("Done") } } 警告:匹配可能并非详尽无遗. 我无法确切地确定这里发生了什么.我在递归数据类型上得到了模式匹配的一般概念,直到你耗尽了案例,但我不清楚它是如何映射到Scala类型系统的.具体来说,我正在查看Scala标准库的源代码,并想知道: >代码中的确切位置是Scala认为需要一个基本案例来完成List类实例的匹配语句?人们当然可以想象一种代数数据类型“只是继续”而没有基本情况. 解决方法
您可以看到List
here的源代码.基本情况没有什么特别之处,只是List被声明为密封,然后只有两个类扩展它:
sealed abstract class List[+A] ... case object Nil extends List[Nothing] { ... } final case class ::[B](override val head: B,private[scala] var tl: List[B]) extends List[B] { ... } Scala编译器可以非常轻松地确定密封特征或抽象类是否完全匹配,因为它可以确定单个文件中可能匹配的范围. Section 8.4 of the Scala specification说:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |