12

考虑以下损坏的功能:

def sum (list : Seq[Int]) : Int = list match {
  case Nil => 0
  case head :: tail => head + sum(tail)
}

在这里,该函数应该与 a 一起使用List[Int],但被重构为接受Seq[Int],因此在编译器没有注意到的情况下被破坏。

Scala 不完整的模式匹配检测中的这个巨大漏洞使它几乎毫无用处。

我想有一种系统地检测这些问题的方法。具体来说,我希望编译器在每个instanceof-guided 模式匹配上发出错误/警告,即我只想允许在密封层次结构和自定义匹配器上进行模式匹配。

是否存在用于对模式匹配安全性进行保守(而不是任意)检查的编译器选项/插件?

4

2 回答 2

3

Nil并且::显然是构造 a 的方法List,但并非所有影响都Seq恰好是Lists,因此人们会期望 Scala 类型检查器将该程序拒绝为类型错误。正确的?

错误的。试试这个,你会明白我的意思:

def sum (list : Seq[Int]) : Int = list match {
  case Nil => 0
  case head :: tail => head + sum(tail)
  case _ => -1
}

> sum(Array(1,2,3).toSeq)
res1: Int = -1
> sum(List(1,2,3))
res2: Int = 6

所以你看,一些 Seq影响可能可以用Niland解构::,所以那些可以的,将会。那些不能匹配的将失败模式匹配并继续前进,尝试下一个匹配。Nil并且::足以涵盖 的所有可能性List,但不能涵盖Seq。这里需要在子类型化、便利性和类型安全性之间进行权衡。目前的解决方案是:重构时要更加小心。

于 2012-01-18T17:28:24.473 回答
3

看看M. Odersky 的这个答案

概括

检查非密封层次结构的匹配是可行的,不是微不足道的,也没有(尚未)实施。

于 2012-01-18T14:52:36.063 回答