2013-04-24 5 views
4

Многие функционал программирования поддержки языков и рекомендовать конструктор Cons данных (списки, как (1, (2, (3))), такие как Haskell и Scala.В чем преимущества Cons?

Но каковы его преимущества? Такие списки не могут быть ни случайным образом получить доступ, не добавляются в O(1).

+2

Преимущества по сравнению с чем именно? Обычно, когда вы говорите о преимуществах, они превосходят некоторые альтернативные методы. – paxdiablo

ответ

6

Cons (сокращение для «построения») не является структурой данных, это название операции для создания СВОД-клетки. И, связав вместе несколько ячеек структура данных может быть построена, в частности - связанный список. Остальная часть обсуждения предполагает, что создается связанный список с операциями cons.

Хотя можно добавить в O (1) в голове, случайным образом доступ к элементам по индексу является дорогостоящей операцией, которая требует обхода всех элементов до того, к которому обращаются.

Преимущества связанного списка? это функциональная структура, дешевая для создания или воссоздания в случае модификаций; он позволяет обмениваться узлами между несколькими списками и позволяет легко собирать мусор. Он очень гибкий, с правильными абстракциями можно представить другие, более сложные структуры данных, такие как стеки, очереди, деревья, графики. И есть много, много процедур, написанных специально для манипулирования списками - например, map, filter, fold и т. Д., Которые делают работу с списками радостью. Наконец, список представляет собой рекурсивную структуру данных, а рекурсия (особенно хвостовая рекурсия) является предпочтительным способом решения проблем на языках функционального программирования; поэтому на этих языках естественно иметь рекурсивную структуру данных как основную структуру данных.

+0

Фактически, OP, похоже, использует «минусы», что типично для традиций ML функционального программирования, где термин «конструктор данных» будет правильным. В этом контексте конструктор данных одновременно служит определением «cons cell», операции, которая ее создает, и шаблоном, используемым для извлечения главы и хвоста существующего списка. Кроме того, на этих языках, как правило, исключительно для списков, а не для цельных блоков, которые блокируют ячейки в лисах. –

2

Прежде всего, давайте разберем «cons» как ник для конструктора данных списка ML-стиля, который обычно называется ::, и откуда происходит прозвище, оригинальная функция cons Lisp-стиля.

В Lisps ячейки cons - это универсальная структура данных, не ограничиваемая списками однородного типа элемента. Эквивалентом в языках ML-стиля были бы вложенные пары или 2-кортежи, при этом пустой список, представленный «единицей», часто записывался (). Óscar López дает хороший обзор полезности Lisp cons, поэтому я оставлю это на этом.

В большинстве языков стиля ML преимущества непременных списков недостатков не слишком отличаются от их использования для списков в Lisps, что позволяет избежать гибкости динамического ввода для обеспечения статической типизации и синтаксиса соответствия шаблону ML-стиля ,

В Haskell, однако, ситуация отличается от ленивой оценки. Конструкторы ленивы, и сопоставление шаблонов на них является одним из немногих способов принудительной оценки, поэтому в отличие от строго оцененных языков часто бывает, что вы должны избегать хвостовой рекурсии. Вместо этого, помещая рекурсивный вызов в хвост списка, становится возможным вычислять каждый рекурсивный вызов только тогда, когда это необходимо. Если лениво-сгенерированный список обрабатывается с использованием соответственно ленивых функций, таких как map или foldr, становится возможным построить и использовать большой список в постоянной памяти, при этом хвосты будут вынуждены с той же скоростью отбрасывать головки для очистки GC ,

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

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

Смежные вопросы