修改列表类

sea*_*ick 0 functional-programming scala

我正在使用Scala中的函数编程,前几章定义了这种类型的数据结构:

sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
Run Code Online (Sandbox Code Playgroud)

当我尝试定义这样的链表时; 它按预期工作:

val nums: List[Int] = Cons(1, Cons(2, Cons(3, Nil)));
Run Code Online (Sandbox Code Playgroud)

我正在尝试定义这样的链接列表,但是我得到了编译错误(类型为scala.collection.immutable.List [Int]的表达式不符合预期类型List [Int]:

val nums: List[Int] = List[Int](1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 1)声明数据结构是否修改了List的内部类?2)为什么不能使用第二种结构?

Jör*_*tag 6

1)声明数据结构是否修改了List的内部类?

没有.

2)为什么不能使用第二种结构?

您正在调用applyList对象的方法.命名的唯一对象List是在范围为scala.collection.immutable.List对象它的apply方法返回的一个实例scala.collection.immutable.List.但是,您已声明nums为类型List[Int],而不是scala.collection.immutable.List[Int],因此这两种类型不兼容.

你需要编写自己的List对象,例如:

object List {
  def apply[A](elements: A*): List[A] = 
    if (elements.isEmpty) Nil else Cons(elements.head, apply(elements.tail :_*))
}
Run Code Online (Sandbox Code Playgroud)