Нельзя сказать, что поле размера было отброшено , так как такой список без размера существовал в течение 50 лет после LISP, где они вездесущи, и они очень распространены в ML и Haskell, оба влияют на scala,
Основная причина в том, что список является рекурсивной структурой.Непустое значение List
равно Cons(head: A, tail: List[A])
- за исключением того, что Cons фактически называется ::
, чтобы обеспечить удобную инфиксную запись.Вы можете получить доступ к хвосту (список без элемента head), и это тоже список.И это делается почти все время.Таким образом, наличие счетчика в списке означало бы не добавление только одного целого числа, а столько целых чисел, сколько есть элементов.Это возможно, но, конечно, не бесплатно.
Если сравнить с LinkedList
в java, LinkedList
имеет рекурсивную реализацию (основанную на Node, которая более или менее похожа на Cons, но со ссылками в обоих направлениях).Но LinkedList не является узлом, он владеет ими (и ведет их учет).Таким образом, пока он имеет рекурсивную реализацию, вы не можете обращаться с ним рекурсивно.Если вы хотите использовать хвост LinkedList в качестве LinkedList, вам придется либо удалить заголовок и изменить свой список, либо скопировать все элементы tail в новый LinkedList.Так что List
в Scala и LinkedList
в Java - это очень разные структуры.