Edycja: Trochę zmieniam pytanie. Najwyraźniej spowodowałem pewne zamieszanie, ponieważ nie zdawałem sobie sprawy, że termin destruktor jest używany w OOP do czegoś zupełnie innego - jest to funkcja wywoływana, gdy obiekt jest niszczony. W programowaniu funkcjonalnym (staramy się) unikać stanu zmiennego, więc nie ma takiego odpowiednika. (Dodałem odpowiedni tag do pytania).
Zamiast tego widziałem, że pole rekordu do rozpakowywania wartości (szczególnie dla typów danych o pojedynczej wartości, takich jak newtype
s) jest czasem nazywane destruktorem lub dekonstruktorem . Na przykład, mamy (w Haskell):
newtype Wrap = Wrap { unwrap :: Int }
Oto Wrap
konstruktor i unwrap
co?
Pytania są następujące:
- Jak nazywamy
unwrap
programowanie funkcjonalne? Deconstructor? Burzyciel? Lub jakimś innym terminem? - Dla wyjaśnienia, czy ta / inna terminologia ma zastosowanie do innych języków funkcjonalnych , czy też jest używana tylko w języku Haskell?
- Być może także, czy istnieje ogólna terminologia w tym zakresie w językach niefunkcjonalnych ?
Widziałem oba warunki, na przykład:
... Najczęściej dostarcza się inteligentnych konstruktorów i destruktorów, aby ułatwić sobie z nimi pracę. ...
na wiki Haskell lub
... Ogólnym tematem jest tutaj połączenie konstruktora z parami dekonstruktorów, takimi jak ...
w Haskell wikibook (tutaj prawdopodobnie ma to nieco bardziej ogólny sens), lub
newtype DList a = DL { unDL :: [a] -> [a] }
Funkcja unDL to nasz dekonstruktor , który usuwa konstruktor DL. ...
źródło
Odpowiedzi:
Pojęcie ma kilka terminów. Uważam, że dekonstrukcja jest powszechna w kręgach Haskella, tak ją nazywa Real World Haskell. Uważam, że termin „restrukturyzacja” (lub „destrukcyjne powiązanie”) jest powszechny w kręgach Lisp.
źródło
Destructor to termin używany przez C ++ i może inne języki, których nie znam. Służą do uwalniania zasobów utworzonych przez konstruktora, więc robią to dokładnie odwrotnie. Być może pojęcie to nie przekłada się dosłownie na Haskella, ale w niektórych miejscach wydaje się, że termin ten jest używany.
EDYCJA: Biorąc pod uwagę twoją edycję pytania, nazwałbym go wtedy odwijaczem ... Byłem w stanie odpowiedzieć na oryginalne pytanie, ale teraz oderwało się ono od mojej wiedzy, więc nie bierz tej edycji zbyt poważnie.
źródło
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?
. O ile pytanie nie zostanie zredagowane tak, aby było bardziej specyficzne dla niektórych koncepcji Haskell, pozostawię swoją odpowiedź bez zmian.W OOP konstruktor to konstrukt funkcji lub języka, który tworzy i inicjuje nowy obiekt („konstruuje” obiekt), a destruktor jest jego konstrukcją podwójną, konstrukcją funkcji lub języka, która czyści po obiekcie (uwalniając wszelkie zasoby wstrzymuje) i usuwa go.
Ponieważ jednak Haskell (w przeciwieństwie do, powiedzmy, C ++) ma funkcję odśmiecania i nie obsługuje stanu zmiennego ani innych efektów ubocznych (przynajmniej nie bezpośrednio), nie ma absolutnie żadnego powodu, by używać pojęcia destruktora w sensie OOP. Ponadto konstruktory Haskell, w przeciwieństwie do konstruktorów OOP, mają więcej zastosowań niż tylko tworzenie obiektów; są również intensywnie używane w dopasowywaniu wzorów (patrz przykład poniżej).
W twoim kodzie „rozpakuj” jest polem rekordu i zależnie od tego, w jaki sposób jest używany, mógłbym nazywać go akcesorium , a może nawet geterem (chociaż ten drugi jest również używany w kontekście obiektywu, więc może być trochę mylącym).
Nigdy nie słyszałem terminu „destruktor” (lub „dekonstruktor”) używanego w kontekście Haskella; jednak, jak zauważa Andres F., czasami jest używany w odniesieniu do funkcji, która usuwa zawijanie wprowadzone przez konstruktora. O ile mi wiadomo, moduł pobierający rekordy może służyć jako destruktor, ale może również pełnić funkcje regularne, pod warunkiem, że odzyskują wartość z bardziej złożonego typu danych. Przykłady obejmują
maybe
ieither
z Preludium.Pamiętaj, że
unwrap
w twoim przykładzie może być kilka rzeczy:map unwrap [ Wrap 23, Wrap 42 ]
; użycie to jest w przybliżeniu równoważne metodzie gettera w OOP.let w = Wrap { unwrap = 23 }
let w' = w { unwrap = 23 }
; jest to podobne do metod ustawiania w OOP (jeśli dużo wyciskasz).f Wrap { unwrap = a } = a
Prawdopodobnie najlepiej jest myśleć o konstruktorach Haskell jako o czymś zupełnie innym niż konstruktory OOP. Sugeruję (ponowne) przeczytanie dobrej książki o języku programowania Haskell dla lepszego zrozumienia - „Real World Haskell” jest naprawdę dobry i słyszałem dobre rzeczy o „Learn You A Haskell” . Oba powinny mieć dobre wyjaśnienia dotyczące konstruktorów, aw szczególności składni rekordów.
źródło
Myślę, że destruktor to szerszy termin. Niektóre języki, takie jak Java i VB.NET, mają finalizator. /programming/171952/is-there-a-destructor-for-java
źródło
Ponieważ wydaje się, że nie ma żadnej konwencji międzyjęzykowej, zwykle nazywam je ekstraktorami , ponieważ jest to termin, który Scala używa do tego ogólnego pojęcia, i ponieważ nie można go pomylić z żadnym istniejącym zastosowaniem.
źródło