为什么Nil :: Nil给出List(List())?

时间:2015-09-26 09:51:36

标签: scala

当我做4 :: Nil时,我得到List(4)。我可以理解它,因为当一个空列表前面加上4时它给出了单个元素列表。但是当我做Nil :: Nil时,我得到List的单个空列表,即List(List()),为什么它会这样?

由于

3 个答案:

答案 0 :(得分:4)

在Scala中,Nil代表一个空列表或List()::运算符接受一个元素并将其添加到列表的开头。它没有连接两个列表。例如,1::List(2,3,4)返回List(1,2,3,4)

因此当您执行4::Nil4::List()时,它会返回List(4)。类似地,Nil::NilList()::List()获取空列表并将其添加到另一个空列表的开头。所以你得到List(List())

但是如果你使用连接运算符:::,即。Nil:::Nil,它会连接两个空列表并返回另一个空列表List()

答案 1 :(得分:2)

右侧Nil是空列表,与之前一样,但该列表的类型由前面的元素设置。在这种情况下,这是左侧Nil,因此被视为前(右)列表前面的新元素。由于Nil的类型为List[_](对于某些人 - 此处未确定 - 类型为_),因此右侧Nil所代表的列表类型将为{{ 1}} - 列表清单。

答案 2 :(得分:0)

理解这一点的另一种方法是使用它的工作原理:

List(1, 2, 3, 4) match {
    case firstElem :: tailOfList => println(tailOfList) // List(2, 3, 4)
    case _ => // do something else
}