Почему вы можете использовать только списки на функциональных языках?

Выяснилось обходное решение: я переименовал свой lgpl2.1_license.txt в lgpl2.1_license.txt.py и поместил несколько трёхколейных цитат вокруг текста. Теперь мне не нужно использовать параметр data_files и не указывать абсолютные пути. Я думаю, что сделать его модулем Python уродливо, но я считаю его менее уродливым, чем указание абсолютных путей.

17
задан ryeguy 16 September 2009 в 20:44
поделиться

5 ответов

Списки на функциональных языках неизменны / постоянны.

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

Добавление узла в конец списка требует модификации последнего узла, чтобы он указывал на вновь созданный узел. Только это невозможно, потому что узел неизменен. Единственный вариант - создать новый узел, который имеет то же значение, что и последний узел, и указывает на вновь созданный хвост. Этот процесс должен повторяться до самого начала списка, в результате чего создается совершенно новый список, который является копией первого списка, за исключением узла thetail. Следовательно, дороже.

21
ответ дан JaredPar 16 September 2009 в 20:44
поделиться

Потому что это быстрее

Они, конечно, могли бы поддерживать добавление, но гораздо быстрее предварять, что они ограничивают API. Кроме того, добавление не работает, так как вы должны затем изменить последний элемент или создать новый список. Prepend работает в неизменном, функциональном стиле по своей природе.

2
ответ дан DigitalRoss 16 September 2009 в 20:44
поделиться

Ограничивая построение списка предваряющим, это означает, что любой другой, кто удерживает ссылку на какую-то часть списка ниже, не увидит, как он неожиданно изменится за спиной. Это позволяет эффективно создавать списки, сохраняя свойство неизменных данных.

1
ответ дан Greg Hewgill 16 September 2009 в 20:44
поделиться

Так определяются списки. Список определяется как связанный список, заканчивающийся нулем, это не просто деталь реализации. Это, в сочетании с тем, что эти языки имеют неизменяемые данные, по крайней мере, в erlang и haskell, означает, что вы не можете реализовать их как двусвязные списки. Добавление элемента приведет к изменению списка, что является незаконным.

2
ответ дан 30 November 2019 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: