Я не уверен, что тебя там беспокоит.Вы можете найти оба в List[A]
ScalaDoc .
List[A]
- это коллекция, которая внутренне хранится как единый связанный список с каждым узлом (Cons
), имеющим head
типа A
и tail
типа List[A]
.
List[A].last
просто возвращает последний элемент в списке, как следует из названия (примечание: это очень неэффективно, так как требует прохождения через всесписок с самого начала).Теперь, поскольку res
имеет тип List[List[A]]
, res.last
имеет тип List[A]
.List[A].head
- первый элемент в списке.
Подводя итог res.last.head
- это первый элемент из последних List
, хранящихся в списке списков res
.
почему есть два оператора case с h::tail
.
Вам необходимо больше узнать о Сопоставлении с образцом в Scala и особенно о "стражах".Код в этом match
/ case
может быть переписан как:
if (rem == Nil)
res // first case
else {
val h = rem.head
val tail = rem.tail
if (res.isEmpty || res.last.head != h)
_pack(res:::List(List(h)), tail) // second case
else
_pack(res.init:::List(res.last:::List(h)), tail) // last case
}
Другими словами, код сначала проверяет, является ли rem
уже пустым, и завершается, если он равен true.Если rem
не пусто, мы берем его head
(h
) и теперь у нас есть выбор: соответствует ли это h
предыдущему элементу в списке или нет.Этот if
защищает первый случай, последний случай без if
работает как ветвь else
.