Який належний термін для функції, оберненої до конструктора - для відкручування значення з типу даних?


13

Редагувати: Я трохи перефразую питання. Мабуть, я викликав деяку плутанину, тому що я не розумів, що термін " деструктор" використовується в ООП для чогось зовсім іншого - це функція, яку викликають при знищенні об'єкта. У функціональному програмуванні ми (намагаємось) уникати змінного стану, щоб такого еквіваленту не було. (Я додав відповідний тег до питання.)

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

newtype Wrap = Wrap { unwrap :: Int }

Ось Wrapконструктор і unwrapщо?

Питання:

  • Як ми називаємо unwrapфункціональне програмування? Деконструктор? Деструктор? Або яким-небудь іншим терміном?
  • І для уточнення, чи застосовується ця / інша термінологія для інших функціональних мов , чи вона використовується просто в Haskell?
  • Можливо також, чи є термінологія для цього взагалі нефункціональними мовами ?

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

... Найчастіше для цього постачаються розумні конструктори та деструктори, щоб полегшити роботу з ними. ...

на Вікі Haskell , або

... Загальною темою тут є сплавлення пар конструктор - деконструктор, як ...

у вікі-книзі Haskell (тут це, мабуть, мається на увазі в більш загальному розумінні), або

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

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

у справжньому світі Haskell .


3
Деструктор, здається, найпоширеніший термін
Захід

3
Це здається спеціалізованим для Haskell ("деструктор" у Haskell - це не та сама концепція, як у C ++. Подібність імені вводить в оману). Якщо ви хочете загальну концепцію "розпакування значення", ви, ймовірно, не повинні використовувати Haskell як приклад. На мовах, схожих на C ++, такий "розмотувач" може бути просто дім!
Андрес Ф.

1
Я пропоную вам зняти слово "деструктор" із запитання, замість цього використати "розмотувач" і запитати, чи є загальна назва цього шаблону на різних мовах :)
Андрес Ф.

1
.unapply, або "витяжка", є грубим аналогом "scala", але, можливо, немає імені, тому що в більшості випадків ви просто узгоджуєтеся
Gene T

Відповіді:


5

Існує кілька термінів для концепції. Деконструкція - це, на мою думку, поширене в колах Haskell, це так, як це називає Haskell Real World. Я вважаю, що термін деструктуризації (або руйнування руйнування) поширений у колах Ліспа.


1
Цікаво, як одна і та ж річ отримує різний термін від однієї мови до іншої, як карта перетворюється на вибір у C #, haskell має складку lisp / java має зменшення, а рубін вводить, haskell прив'язує scala має рівну карту C # має selectmany
Jimmy Hoffa

Це дійсно називається деконструкцією в колах Хаскелла. Якщо це здається дивним, майте на увазі, що у Haskell немає об’єктів - просто значення; Отже, само собою зрозуміло, що термін має інше значення. Велика частина полягає в тому, що саме «деконструкція» - це саме те, що вона робить. З цього приводу я особисто думаю, що деконструктори об'єктів повинні бути названі чимось за принципом розпорядження об'єктів. Це набагато, набагато точніше.
MasterMastic

8

Destructor - це термін, який використовується C ++ і, можливо, іншими мовами, яких я не знаю. Вони використовуються для випуску ресурсів, створених конструктором, так що вони роблять прямо протилежне цьому. Можливо, концепція не перекладається буквально на Haskell, але термін, здається, використовується в деяких місцях.

EDIT: Враховуючи вашу редакцію до питання, я б тоді назвав це розгортанням ... Я зміг відповісти на початкове запитання, але тепер це відійшло від моїх знань, тому не сприймайте цю редакцію надто серйозно.


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?. Якщо питання не буде відредаговано більш конкретно для якоїсь концепції Хаскелла, я залишу свою відповідь такою, яка є.
marco-fiset

1
Лише зауважте, що у C # є фіналізатори, але не деструктори, які відрізняються тим, що фіналізатори мають недетерміноване виконання. Тож, можливо, відредагуйте свою відповідь, щоб не поширювати неправильне слово деструкторів у C #.
Джиммі Хоффа

6

У OOP конструктор - це функція або мовна конструкція, яка створює та ініціалізує новий об'єкт ("конструює" об'єкт), а деструктор - його подвійний, функціональний або мовний конструкт, який очищається після об'єкта (вивільняючи будь-які ресурси тримає) та видаляє його.

Однак, оскільки Haskell (на відміну від, скажімо, C ++) має збирання сміття і не підтримує стан, що змінюється, або інші побічні ефекти (принаймні, безпосередньо), немає абсолютно ніякої причини для деструкторського поняття в сенсі OOP. Також конструктори Haskell, на відміну від конструкторів OOP, мають більше застосувань, ніж просто створення об'єктів; вони також широко використовуються для узгодження зразків (див. приклад нижче).

У вашому прикладі коду "unrap" - це поле запису , і залежно від способу його використання я можу позначати його як аксесуар або, можливо, навіть геттер (хоча останній також використовується в контексті об'єктива, так що він може насправді трохи заплутано).

Я ніколи не чув поняття «деструктор» (або «деконструктор»), яке вживається в контексті Haskell; як зазначає Андрес Ф., проте іноді його використовують для позначення функції, яка скасовує обгортку, введене конструктором. Наскільки я розумію, пристрій для отримання записів може служити деструктором, але це може слугувати регулярними функціями, за умови, що вони отримують значення від більш складного типу даних. Приклади включають maybeі eitherпрелюдію.

Зауважте, що unwrapу вашому прикладі може бути кілька речей:

  • функція (як і будь-яка інша): ви можете, наприклад, виконувати map unwrap [ Wrap 23, Wrap 42 ]; таке використання приблизно еквівалентне методу геттера в OOP.
  • специфікатор поля запису в конструкції запису: let w = Wrap { unwrap = 23 }
  • запис поля Специфікатор в рекордному оновлення: let w' = w { unwrap = 23 }; це схоже на методи сеттера в OOP (якщо сильно стискати).
  • специфікатор поля запису у відповідності шаблонів: f Wrap { unwrap = a } = a

Напевно, найкраще думати про конструктори Haskell як про щось, що зовсім відрізняється від конструкторів OOP. Я пропоную вам (пере-) прочитати гарну книгу на мові програмування Haskell для кращого розуміння - «Реальний світ 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 lingo - це "розкручувач", концепція, абсолютно не пов'язана з управлінням пам'яттю або доопрацюванням об'єкта.
Андрес Ф.

3
Мій директор дипломної роботи, який програмує виключно в Haskell, також використовує термін "деструктор" для розгортання.
Андрес Ф.

Ну, я ніколи не стикався з цим терміном. Ви абсолютно праві, що при використанні це абсолютно не має нічого спільного з концепцією деструктора в OOP.
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.