关于scala:列表上的模式匹配表现得很奇怪?

Pattern Matching on lists behaving weird?

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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)
  }
}

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

1
2
3
4
5
6
7
8
9
10
11
  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

  }

我在这里错过了什么非常琐碎的事情吗??

编辑:
修改代码如下:

1
2
3
4
5
6
7
8
9
10
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)

  }

在第一个 case 语句中仍然出现错误 - Pattern type is incompatible with expected type. Found: ::[B], expected: List[Int]

在 Scala 插件中使用 Intellij Idea - 2.11.7.

enter


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

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

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