Вы должны создать список с одним в нем в любом случае. Хвост хвоста хвоста [1,2,3,1]
составляет [1]
. Итак, если у вас есть [1,2,3,1]
в памяти, у вас также есть [1]
где-то в памяти.
Таким образом, даже если бы существовал такой оператор, как [1,2,3] @:: 1
, это не повлияет, поскольку ему все еще необходимо создать список с одним в нем.
PS: Реальная проблема с xs @ [x]
не является созданием списка, а тем, что его время выполнения находится в O (n) (в отличие от x :: xs
, который находится в O (1)). Это также проблема, присущая природе неизменяемых односвязных списков и, следовательно, не может быть им помогла, но именно поэтому вы, как правило, должны избегать добавления к концу списка.
Как @ sepp2k сказал, добавление к концу списка дорого. Одним из самых медленных способов создания списка является добавление элементов один за другим до конца, поскольку любой такой подход в лучшем случае квадратичен по длине списка. По этой причине программисты SML иногда пишут функцию, которая создает списки в обратном порядке (добавление к фронту, а не назад, даже в ситуациях, когда добавление к спине кажется более естественным), а затем запустить результирующий список через 'rev' (который реализуется умным способом, так что это «O (n)»), чтобы получить нужный список. –
Нет ли указателя на хвост для добавления? который также был бы O (1) – Har
@Har Добавление к указателю на хвост (если бы даже один был, а его нет) изменил бы первоначальный список. Списки SML не изменяются, поэтому это не может быть и речи. – sepp2k