Ответ 1
[email protected][element]
должен работать. @
объединяет списки.
Поскольку :: : 'a -> 'a list -> 'a list
используется для добавления элемента в список begin списка, может ли кто-нибудь сказать мне, есть ли функция для добавления элемента в конец списка? Если нет, я думаю, List.rev (element::(List.rev list))
- самый простой способ сделать это?
Спасибо!
[email protected][element]
должен работать. @
объединяет списки.
Причина, по которой нет стандартной функции, заключается в том, что добавление в конце списка - это анти-шаблон (он же "список snoc" или Алгоритм Schlemiel the Painter). Для добавления элемента в конце списка требуется полная копия списка. Добавление элемента в начале списка требует выделения отдельной ячейки - хвост нового списка может просто указывать на старый список.
Тем не менее, самый простой способ сделать это -
let append_item lst a = lst @ [a]
Учитывая, что эта операция является линейной, вы не должны использовать ее в "горячей" части вашего кода, где важна производительность. В холодной части используйте list @ [element]
как подскажите Adi
. В горячей части перепишите свой алгоритм так, чтобы вам не нужно было это делать.
Типичный способ сделать это - накапливать результаты в обратном порядке во время обработки, а затем возвращать весь накопленный список перед возвратом результата. Если у вас есть N шагов обработки (каждый из которых добавляет элемент в список), вы поэтому амортизируете линейную стоимость обращения по N элементам, поэтому вы держите линейный алгоритм вместо квадратичного.
В некоторых случаях другой метод работы заключается в обработке ваших элементов в обратном порядке, так что накопленные результаты оказываются в правильном порядке без явного шага разворота.