Каков самый простой способ добавить элемент в конец списка?

Поскольку :: : 'a -> 'a list -> 'a list используется для добавления элемента в список begin списка, может ли кто-нибудь сказать мне, есть ли функция для добавления элемента в конец списка? Если нет, я думаю, List.rev (element::(List.rev list)) - самый простой способ сделать это?

Спасибо!

Ответ 1

[email protected][element] должен работать. @ объединяет списки.

Ответ 2

Причина, по которой нет стандартной функции, заключается в том, что добавление в конце списка - это анти-шаблон (он же "список snoc" или Алгоритм Schlemiel the Painter). Для добавления элемента в конце списка требуется полная копия списка. Добавление элемента в начале списка требует выделения отдельной ячейки - хвост нового списка может просто указывать на старый список.

Тем не менее, самый простой способ сделать это -

let append_item lst a = lst @ [a]

Ответ 3

Учитывая, что эта операция является линейной, вы не должны использовать ее в "горячей" части вашего кода, где важна производительность. В холодной части используйте list @ [element] как подскажите Adi. В горячей части перепишите свой алгоритм так, чтобы вам не нужно было это делать.

Типичный способ сделать это - накапливать результаты в обратном порядке во время обработки, а затем возвращать весь накопленный список перед возвратом результата. Если у вас есть N шагов обработки (каждый из которых добавляет элемент в список), вы поэтому амортизируете линейную стоимость обращения по N элементам, поэтому вы держите линейный алгоритм вместо квадратичного.

В некоторых случаях другой метод работы заключается в обработке ваших элементов в обратном порядке, так что накопленные результаты оказываются в правильном порядке без явного шага разворота.