scala mergesort非详尽模式匹配错误

时间:2016-06-30 01:52:19

标签: scala pattern-matching

这是我的实施:

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 {

这个错误是什么意思?我错过了什么组合?

1 个答案:

答案 0 :(得分:0)

模式守卫(if x <= yif y < x)实际上阻止了Scala检查穷举,请参阅https://issues.scala-lang.org/browse/SI-5365。因此,您不应该在此代码上收到此警告。

但是如果编译器确实检查了(might in 2.12或将来进一步检查),它可能无法看到这两个警卫涵盖所有可能的情况(不专门处理这个特定情况或制作语言更复杂的)。在这种情况下,移除第二个防护装置将解决问题。