2015-09-26 2 views
0

Когда я делаю 4 :: Nil, я получаю List (4). Я мог понять это, потому что, когда пустой список добавляется с 4, он дает список отдельных элементов. Но когда я делаю Nil :: Nil, я получаю List с единственным пустым списком i.e List (List()), почему он ведет себя таким образом?Почему Nil :: Nil возвращает список (List())?

Благодаря

ответ

4

В Scala, Nil представляет собой пустой список или List(). Оператор :: берет один элемент и добавляет его в начало списка. Он не объединяет два списка. Например, 1::List(2,3,4) возвращает List(1,2,3,4).

Так что, когда вы делаете 4::Nil или 4::List(), он возвращает List(4). Аналогично Nil::Nil или List()::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 
} 
Смежные вопросы