++ [x]
- это правильный способ добавить элемент в конец списка, но в комментарии говорится, что вы не должны добавлять элементы в конец списка.
Из-за способа определения списков добавление элемента в конце всегда требует создания копии списка. То есть
xs ++ ys
необходимо скопировать все xs
, но можно повторно использовать ys
без изменений.
Если xs
- это всего лишь один элемент (т.е. мы добавляем в начало списка), это не проблема: копирование одного элемента практически не занимает времени совсем.
Но если xs
длиннее, нам нужно провести больше времени в ++
.
И если мы делаем это неоднократно (то есть мы создаем большой список, постоянно добавляя элементы в конец), то нам нужно потратить много времени на создание избыточных копий. (Построение списка n-элементов таким способом является операцией O (n 2 ).)
Если вам нужно сделать это, обычно есть лучший способ структурировать ваш алгоритм. Например, вы можете построить свой список в обратном порядке (добавляя элементы в начале) и вызывать только reverse
в конце.