2015-09-26 186 views
0

當我做4 ::無,我得到列表(4)。我可以理解它,因爲當一個空列表被預置爲4時,它會給出單個元素列表。但是當我做Nil :: Nil時,我得到帶有單個空列表的List(即List(List())),爲什麼它的行爲如此?爲什麼Nil :: Nil會返回List(List())?

由於

回答

4

在斯卡拉,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()

2

右手Nil是空列表,和以前一樣,但是列表的類型被元件設置被預先考慮到它。在這種情況下,這是左手Nil,因此將其視爲預先添加到(右側)列表中的新元素。由於Nil的類型是List[_](對於某些 - 此處未確定 - 類型_),右側Nil所代表的列表的類型將爲List[List[_]] - 列表的列表。

0

另一種方式來理解它是如何工作的,這將是使用:

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