繁体   English   中英

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

[英]How to systematically avoid unsafe pattern matching in Scala?

考虑以下破坏的功能:

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

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

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

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

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

看看M. Odersky的这个答案

摘要

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

Nil::显然是构建List ,但并不是所有的Seq uences恰好都是Lists ,所以人们会期望Scala类型检查器拒绝这个程序为ill-typed。 对?

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

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 uences 可能能够用Nil::解构,所以那些可以,将会。 那些不能失败的模式匹配并继续前进,尝试下一场比赛。 Nil::足以涵盖List所有可能性,但不适用于Seq 在子类型,便利性和类型安全性之间存在权衡。 现在的解决方案是:重构时要更加小心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM