Я использовал только 3 функциональных языка - scala, erlang и haskell, но во всех трех из них правильный способ создания списков состоит в том, чтобы добавить новые данные на передний план, а затем перевернуть его, а не просто добавление к концу. Конечно, вы можете добавить в списки, но это приводит к созданию совершенно нового списка.
Почему это? Я мог представить это, потому что списки реализованы внутри как связанные списки, но почему они не могут быть реализованы в виде двусвязных списков, поэтому вы можете добавить их до конца без штрафа? Есть ли причина, по которой все функциональные языки имеют это ограничение?