[英]How to avoid syntax overhead for def definition with pattern matching in 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模式匹配上发出错误/警告,即我只想在密封层次结构和自定义匹配器上允许模式匹配。
是否存在用于对模式匹配安全性进行保守(而不是任意)检查的现有编译器选项/插件?
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.