Редактировать: я перефразирую вопрос немного. По-видимому, я вызвал некоторую путаницу, потому что я не понимал, что термин « деструктор» используется в ООП для чего-то совершенно иного - это функция, вызываемая при разрушении объекта. В функциональном программировании мы (стараемся) избегать изменяемого состояния, поэтому такого эквивалента нет. (Я добавил правильный тег к вопросу.)
Вместо этого я видел, что поле записи для разворачивания значения (особенно для однозначных типов данных, таких как newtype
s) иногда называют деструктором или, возможно, деконструктором . Например, давайте иметь (в Haskell):
newtype Wrap = Wrap { unwrap :: Int }
Вот Wrap
этот конструктор и unwrap
что?
Вопросы:
- Как мы называем
unwrap
в функциональном программировании? Разрушитель? Деструктор? Или каким-то другим термином? - И чтобы уточнить, применима ли эта / другая терминология к другим функциональным языкам или она используется только в Haskell?
- Возможно также, есть ли вообще терминология для этого в нефункциональных языках ?
Я видел оба термина, например:
... Чаще всего мы предоставляем умных конструкторов и деструкторов, которые облегчают работу с ними. ...
на Haskell вики или
... Общая тема здесь - объединить пары конструктор - деконструктор, как ...
в Haskell wikibook (здесь это, вероятно, подразумевается в более общем смысле), или
newtype DList a = DL { unDL :: [a] -> [a] }
Функция unDL является нашим деконструктором , который удаляет конструктор DL. ...
источник
Ответы:
Есть несколько терминов для концепции. Деконструкция - это то, что, как я считаю, распространено в кругах Хаскелла, это то, что в реальном мире Хаскелл называет это. Я полагаю, что термин деструктурирование (или деструктурирующая привязка) распространен в кругах Лисп.
источник
Деструктор - это термин, используемый в C ++ и, возможно, в других языках, о которых я не знаю. Они используются для освобождения ресурсов, созданных конструктором, поэтому они делают полную противоположность этому. Возможно, концепция не переводится буквально на Хаскелл, но этот термин, кажется, используется в некоторых местах.
РЕДАКТИРОВАТЬ: Учитывая ваши изменения в вопросе, я бы тогда назвал это развёрткой ... Я смог ответить на первоначальный вопрос, но теперь он отошел от моих знаний, так что не принимайте это редактирование слишком серьезно.
источник
Maybe in Haskell this does not translate really well but I don't know the language.
What's the proper term for a function inverse to a constructor?
. Если вопрос не будет отредактирован, чтобы быть более конкретным для некоторой концепции Haskell, я оставлю свой ответ как есть.В ООП конструктор - это функция или языковая конструкция, которая создает и инициализирует новый объект («конструирует» объект), а деструктор - это его двойник, функция или языковая конструкция, которая очищается после объекта (высвобождая любые ресурсы, которые он держит) и удаляет его.
Однако, поскольку Haskell (в отличие, скажем, от C ++) имеет сборку мусора и не поддерживает изменяемое состояние или другие побочные эффекты (по крайней мере, не напрямую), нет абсолютно никаких причин для понятия деструктора в смысле ООП. Кроме того, конструкторы Haskell, в отличие от конструкторов ООП, имеют больше приложений, чем просто создание объектов; они также интенсивно используются при сопоставлении с образцом (см. пример ниже).
В вашем примере кода «разворачивать» является поле записи , и в зависимости от того, как он используется, я мог бы обратиться к нему как аксессору , или , возможно , даже геттер (хотя последний также используется в контексте объектива, так что может на самом деле быть немного запутанным).
Я никогда не слышал, чтобы термин «деструктор» (или «деконструктор») сам использовался в контексте Хаскелла; однако, как отмечает Андрес Ф., иногда он используется для ссылки на функцию, которая отменяет перенос, введенный конструктором. Насколько я понимаю, средство получения записей может служить деструктором, но могут и обычные функции, при условии, что они возвращают значение из более сложного типа данных. Примеры включают
maybe
иeither
из прелюдии.Обратите внимание, что
unwrap
в вашем примере может быть несколько вещей:map unwrap [ Wrap 23, Wrap 42 ]
; это использование примерно эквивалентно методу получения в ООП.let w = Wrap { unwrap = 23 }
let w' = w { unwrap = 23 }
; это похоже на методы установки в ООП (если вы сильно сжимаете).f Wrap { unwrap = a } = a
Вероятно, лучше всего думать о конструкторах Haskell как о чем-то совершенно отличном от конструкторов ООП. Я предлагаю вам (пере) прочитать хорошую книгу о языке программирования Haskell для лучшего понимания - «Real World Haskell» действительно хорош, и я слышал хорошие вещи об «Learn You A Haskell» . Оба должны иметь хорошие объяснения о конструкторах и синтаксис записи в частности.
источник
Я думаю, что деструктор это более широкий термин. Некоторые языки, такие как Java и VB.NET, имеют финализатор. /programming/171952/is-there-a-destructor-for-java
источник
Поскольку между языковыми соглашениями, кажется, нет никаких соглашений, я обычно называю их экстракторами , потому что это термин, который Scala использует для этого общего понятия, и потому что его вряд ли можно спутать с любым существующим использованием.
источник