为什么在使用cons运算符构建的列表的末尾需要Nil

M.K*_*.K. 4 scala

我正在学习Scala(Programming Scala,第2版,Odersky).

使用cons运算符构建列表时,我们必须编写:

val l = 1 :: 2 :: 3 :: 4 :: Nil
Run Code Online (Sandbox Code Playgroud)

为什么我们最后需要Nil?为什么编译器不能理解4是最后一个元素,所以只需编写它:

val l = 1 :: 2 :: 3 :: 4
Run Code Online (Sandbox Code Playgroud)

rig*_*old 9

签名::大致是:

case class ::[E](hd: E, tl: List[E]) extends List[E]

// which generates this automatically:

object :: {
    def apply[E](hd: E, tl: List[E]): ::[E]
}
Run Code Online (Sandbox Code Playgroud)

签名Nil大致是:

object Nil extends List[Nothing]
Run Code Online (Sandbox Code Playgroud)

如您所见,::获取元素和列表.4不是列表,Nil而是.

  • 正确.以冒号(:)开头的运算符在Scala中是正确关联的,基本上是为了支持这个用例. (2认同)
  • 有一种工厂方法,但不能以这种方式使用.你实际上使用`List`中定义的`::`,它是`def :: [B>:A](x:B):List [B] = new scala.collection.immutable.::( x ,这)` (2认同)