加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala类型系统如何知道Nil是穷举的?

发布时间:2020-12-16 18:18:31 所属栏目:安全 来源:网络整理
导读:我刚写了这个函数,想知道如果我省略了Nil的情况会发生什么,并注意到 scalac给了我一个警告: def printList[String](list: List[String]) { list match { case head :: tail = { println(head) printList(tail) } //case Nil = println("Done") }} 警告:匹
我刚写了这个函数,想知道如果我省略了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类实例的匹配语句?人们当然可以想象一种代数数据类型“只是继续”而没有基本情况.
>代码中的确切位置scala.collection.immutable.Nil特别指定为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说:

If the selector of a pattern match is an instance of a sealed class,the compilation of pattern matching can emit warnings which diagnose that a given set of patterns is not exhaustive,i.e. that there is a possibility of a MatchError being raised at run-time.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读