Прежде всего, давайте разберем «cons» как ник для конструктора данных списка ML-стиля, который обычно называется ::
, и откуда происходит прозвище, оригинальная функция cons
Lisp-стиля.
В Lisps ячейки cons - это универсальная структура данных, не ограничиваемая списками однородного типа элемента. Эквивалентом в языках ML-стиля были бы вложенные пары или 2-кортежи, при этом пустой список, представленный «единицей», часто записывался ()
. Óscar López дает хороший обзор полезности Lisp cons
, поэтому я оставлю это на этом.
В большинстве языков стиля ML преимущества непременных списков недостатков не слишком отличаются от их использования для списков в Lisps, что позволяет избежать гибкости динамического ввода для обеспечения статической типизации и синтаксиса соответствия шаблону ML-стиля ,
В Haskell, однако, ситуация отличается от ленивой оценки. Конструкторы ленивы, и сопоставление шаблонов на них является одним из немногих способов принудительной оценки, поэтому в отличие от строго оцененных языков часто бывает, что вы должны избегать хвостовой рекурсии. Вместо этого, помещая рекурсивный вызов в хвост списка, становится возможным вычислять каждый рекурсивный вызов только тогда, когда это необходимо. Если лениво-сгенерированный список обрабатывается с использованием соответственно ленивых функций, таких как map
или foldr
, становится возможным построить и использовать большой список в постоянной памяти, при этом хвосты будут вынуждены с той же скоростью отбрасывать головки для очистки GC ,
Общепринятая перспектива в Haskell заключается в том, что список ленивых минусов - это не столько структура данных, сколько структура . Структура - цикл reified, который эффективно объединяется с другими такими циклами.
Это много раз, когда список недостатков - , а не - например, когда требуется повторный случайный доступ - и в таких ситуациях использование списков, конечно же, не рекомендуется.
Преимущества по сравнению с чем именно? Обычно, когда вы говорите о преимуществах, они превосходят некоторые альтернативные методы. – paxdiablo