如何系统地避免Scala中的不安全模式匹配?

Rot*_*sor 12 scala pattern-matching non-exhaustive-patterns

考虑以下破坏的功能:

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

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

Scala不完整模式匹配检测中的这个空洞使得它几乎无用.

我想有办法系统地发现这些问题.具体来说,我希望编译器在每个instanceof引导模式匹配时发出错误/警告,即我只想在密封层次结构和自定义匹配器上允许模式匹配.

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

zig*_*tar 3

看看M. Odersky 的回答。

概括

对非密封层次结构的匹配进行检查是可行的,但并非微不足道且尚未实现。

  • 这没有抓住重点。我不要求编译器无所不知,甚至聪明。我只是希望检查变得保守,这意味着在“安全/不安全/未知”分析中,只有第一个分析会在没有警告的情况下被接受。 (2认同)