这是我的实施:
def mergesort(xs:List[Int]) : List[Int] = {
def left(xs:List[Int]) = xs.take(xs.length / 2)
def right(xs:List[Int]) = xs.drop(xs.length / 2)
def merge(xs:List[Int], ys:List[Int]):List[Int] = (xs, ys) match {
case(x::xs, y::ys) if x <= y => x::merge(xs, ys)
case(x::xs, y::ys) if y < x => y::merge(xs, ys)
case(Nil, Nil) => List()
case(Nil, ys) => ys
case(xs, Nil) => xs
}
if (xs.length == 0) {
List()
}
else if (xs.length == 1) {
xs
}
else {
merge(mergesort(left(xs)), mergesort(right(xs)))
}
}
当我尝试编译时,我收到此错误:
warning: match is not exhaustive!
missing combination * Nil * *
def merge(xs:List[Int], ys:List[Int]):List[Int] = (xs, ys) match {
这个错误是什么意思?我错过了什么组合?
答案 0 :(得分:0)
模式守卫(if x <= y
和if y < x
)实际上阻止了Scala检查穷举,请参阅https://issues.scala-lang.org/browse/SI-5365。因此,您不应该在此代码上收到此警告。
但是如果编译器确实检查了(might in 2.12或将来进一步检查),它可能无法看到这两个警卫涵盖所有可能的情况(不专门处理这个特定情况或制作语言更复杂的)。在这种情况下,移除第二个防护装置将解决问题。