在练习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。
答案 0 :(得分:2)
查看your screenshot,您将在同一个包List
中定义自己的Week04
类。它在左侧的项目浏览器中可见。所以在你的代码中
def iSort(l: List[Int]) = ???
你有Week04.List[Int]
类型的参数。您尝试使用::
list-cons类对其进行解构。我认为你没有定义你的::
版本,至少我不记得这是定义了Coursera类。所以这里有一个scala.::
,这是scala.List
的子类型。所以你试图模式匹配一些完全不同的类型。如果您用List
替换scala.List
的每次出现,您将使用Scala的标准列表类,它应该可以工作。如果您希望使用自己的列表实现,则需要定义自己的提取器。