列表上的模式匹配表现得很奇怪?

时间:2016-02-29 14:45:48

标签: scala pattern-matching

在练习scala时,我试图使用模式匹配对整数列表进行插入排序。以前,以下打印列表的代码绝对正常:

object PrintList {
 def iPrint(xs: List[Int]):Unit = xs match {

      case x :: ys => {
        print(x+" -> ")
        iPrint(ys)
      }
      case _ => println("Nil")
  }

  def main(args: Array[String]) {

    //val l = Nil.::(1).::(2).::(3).::(4)
    val l = 4 :: 3 :: 2 :: 1 :: Nil

    iPrint(l)
  }
}

但是,以下用于对列表进行排序的代码不会编译:

  def insert(x : Int, l1 : List[Int]):List = {
    //stubbed
    List()
  }

  def iSort(l : List[Int]):List = l match {

    case x :: ys => insert(x , iSort(ys))
    case Nil => Nil

  }

我错过了一些非常微不足道的事情吗?

修改 修改了如下代码:

def insert(x : Int , l1 : List[Int]):List[Int] = {
    //stubbed
    List(0)
  }

  def iSort(l : List[Int]):List[Int] = l match {
    case (x:Int) :: (ys:List[Int]) => insert(x , iSort(ys))
    case _ => List(0)

  }

在第一个案例陈述中仍然出现错误 - Pattern type is incompatible with expected type. Found: ::[B], expected: List[Int]

将Intellij Idea与scala插件一起使用 - 2.11.7。

enter image description here

1 个答案:

答案 0 :(得分:2)

查看your screenshot,您将在同一个包List中定义自己的Week04类。它在左侧的项目浏览器中可见。所以在你的代码中

def iSort(l: List[Int]) = ???

你有Week04.List[Int]类型的参数。您尝试使用:: list-cons类对其进行解构。我认为你没有定义你的::版本,至少我不记得这是定义了Coursera类。所以这里有一个scala.::,这是scala.List的子类型。所以你试图模式匹配一​​些完全不同的类型。如果您用List替换scala.List的每次出现,您将使用Scala的标准列表类,它应该可以工作。如果您希望使用自己的列表实现,则需要定义自己的提取器。