Какой правильный термин для функции, обратной конструктору - чтобы развернуть значение из типа данных?


13

Редактировать: я перефразирую вопрос немного. По-видимому, я вызвал некоторую путаницу, потому что я не понимал, что термин « деструктор» используется в ООП для чего-то совершенно иного - это функция, вызываемая при разрушении объекта. В функциональном программировании мы (стараемся) избегать изменяемого состояния, поэтому такого эквивалента нет. (Я добавил правильный тег к вопросу.)

Вместо этого я видел, что поле записи для разворачивания значения (особенно для однозначных типов данных, таких как newtypes) иногда называют деструктором или, возможно, деконструктором . Например, давайте иметь (в Haskell):

newtype Wrap = Wrap { unwrap :: Int }

Вот Wrapэтот конструктор и unwrapчто?

Вопросы:

  • Как мы называем unwrapв функциональном программировании? Разрушитель? Деструктор? Или каким-то другим термином?
  • И чтобы уточнить, применима ли эта / другая терминология к другим функциональным языкам или она используется только в Haskell?
  • Возможно также, есть ли вообще терминология для этого в нефункциональных языках ?

Я видел оба термина, например:

... Чаще всего мы предоставляем умных конструкторов и деструкторов, которые облегчают работу с ними. ...

на Haskell вики или

... Общая тема здесь - объединить пары конструктор - деконструктор, как ...

в Haskell wikibook (здесь это, вероятно, подразумевается в более общем смысле), или

newtype DList a = DL { unDL :: [a] -> [a] }

Функция unDL является нашим деконструктором , который удаляет конструктор DL. ...

в реальном мире Haskell .


3
Деструктор, кажется, наиболее широко используемый термин
Zavior

3
Это кажется специализированным для Haskell («деструктор» в Haskell не является тем же понятием, что и в C ++. Сходство имен вводит в заблуждение). Если вам нужна общая концепция «развертывания значения», вам, вероятно, не следует использовать Haskell в качестве примера. В C ++ -подобных языках такой «распаковщик» может быть просто получателем!
Андрес Ф.

1
Я предлагаю вам удалить слово «деструктор» из вопроса, вместо этого использовать «unwrapper» и спросить, существует ли общее название для этого шаблона в разных языках :)
Andres F.

1
.unapply, или «extractor» - грубый аналог в scala, но, возможно, там нет названия, потому что в большинстве случаев вы просто сопоставляете шаблон
Gene T

Ответы:


5

Есть несколько терминов для концепции. Деконструкция - это то, что, как я считаю, распространено в кругах Хаскелла, это то, что в реальном мире Хаскелл называет это. Я полагаю, что термин деструктурирование (или деструктурирующая привязка) распространен в кругах Лисп.


1
Интересно, как одно и то же слово получает разные термины от одного языка к другому, как карта превращается в select в C #, haskell имеет сложение lisp / java, уменьшает и ruby ​​имеет инъекцию, haskell имеет привязку scala, имеет flatmap C # имеет selectmany
Джимми Хоффа

Это действительно называется деконструкцией в кругах Хаскеля. Если это звучит странно, имейте в виду, что у Haskell нет объектов - только значения; Поэтому само собой разумеется, что термин имеет другое значение. Самое замечательное в том, что «деконструкция» - это именно то, что она делает. На этой ноте я лично считаю, что деконструкторы объектов должны называться как-то по-другому. Это намного, намного точнее.
MasterMastic

8

Деструктор - это термин, используемый в C ++ и, возможно, в других языках, о которых я не знаю. Они используются для освобождения ресурсов, созданных конструктором, поэтому они делают полную противоположность этому. Возможно, концепция не переводится буквально на Хаскелл, но этот термин, кажется, используется в некоторых местах.

РЕДАКТИРОВАТЬ: Учитывая ваши изменения в вопросе, я бы тогда назвал это развёрткой ... Я смог ответить на первоначальный вопрос, но теперь он отошел от моих знаний, так что не принимайте это редактирование слишком серьезно.


1
Обратите внимание, что использование C ++ / C # / Java термина «деструктор» не совпадает с термином Haskell. Одно и то же слово, разные понятия.
Андрес Ф.

1
@AndresF. Да, именно поэтому я добавил предложение:Maybe in Haskell this does not translate really well but I don't know the language.
marco-fiset

1
Достаточно справедливо, я снял свое понижение. Я думаю, что ошибочным является фактический вопрос, который, кажется, задает одно, а на самом деле задает другое! :)
Андрес Ф.

@AndresF. Да, вопрос вводит в заблуждение. OP спрашивает: What's the proper term for a function inverse to a constructor?. Если вопрос не будет отредактирован, чтобы быть более конкретным для некоторой концепции Haskell, я оставлю свой ответ как есть.
Марко-Фисет

1
Просто обратите внимание, что в C # есть финализаторы, но нет деструкторов, которые отличаются тем, что финализаторы имеют недетерминированное выполнение. Так что, возможно, отредактируйте свой ответ, чтобы не распространять неправильный деструктор в C #.
Джимми Хоффа

6

В ООП конструктор - это функция или языковая конструкция, которая создает и инициализирует новый объект («конструирует» объект), а деструктор - это его двойник, функция или языковая конструкция, которая очищается после объекта (высвобождая любые ресурсы, которые он держит) и удаляет его.

Однако, поскольку 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» . Оба должны иметь хорошие объяснения о конструкторах и синтаксис записи в частности.


2
Доказательства использования термина «деструктор» в сообществах Haskell: haskell.org/pipermail/beginners/2010-April/003946.html и mail-archive.com/haskell-cafe@haskell.org/msg26463.html . «Деструктор» в языке Haskell - это «распаковщик», концепция, совершенно не связанная с управлением памятью или финализацией объекта.
Андрес Ф.

3
Директор моей диссертации, который программирует исключительно на Хаскеле, также использует термин «деструктор» для развертывания.
Андрес Ф.

Ну, я никогда не сталкивался с этим термином. Вы абсолютно правы в том, что при использовании он не имеет ничего общего с концепцией деструктора в ООП.
tdammers

@AndresF .: Отредактировано, чтобы почтить ваши замечания.
tdammers

@AndresF. Это интересно, так как я также никогда не слышал, чтобы это называлось деструктором, хотя, кроме этого, не будет ли точным просто ссылаться на него как на поле записи, а технику, которую я вижу, называемую «деструктором», просто как на совпадение с шаблоном. ? Я понимаю, что это называется "деструктуризация", когда ваш матч разделяет список, возможно, это связанный термин, но по отношению к ADT? После того, как вся деструктуризация списка просто действует на ADT, как это и есть список ... Я получил термин деструктуризация от stackoverflow.com/questions/11677806/…
Джимми Хоффа

2

Я думаю, что деструктор это более широкий термин. Некоторые языки, такие как Java и VB.NET, имеют финализатор. /programming/171952/is-there-a-destructor-for-java


Деструктор в C ++ -подобных языках выполняет действия по очистке перед освобождением выделенной памяти. Деструктор в Haskell разворачивает значение из своего «внешнего слоя» (вы не используете его для очистки чего-либо). Это не совсем связанные понятия.
Андрес Ф.

2
Думаю, я не осознавал, что это вопрос Хаскеля.
JeffO

Это было не совсем понятно. Вопрос теперь помечен и переформулирован :)
Андрес Ф.

2

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.