Jaki jest właściwy termin dla funkcji odwrotnej do konstruktora - aby rozpakować wartość z typu danych?

13

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 newtypes) jest czasem nazywane destruktorem lub dekonstruktorem . Na przykład, mamy (w Haskell):

newtype Wrap = Wrap { unwrap :: Int }

Oto Wrapkonstruktor i unwrapco?

Pytania są następujące:

  • Jak nazywamy unwrapprogramowanie 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. ...

w The Real World Haskell .

Petr Pudlák
źródło
3
Destructor wydaje się być najczęściej używanym terminem
Zavior,
3
Wydaje się to wyspecjalizowane dla Haskella („destruktor” w Haskell nie jest tym samym pojęciem co w C ++. Podobieństwo nazwy wprowadza w błąd). Jeśli chcesz ogólnej koncepcji „rozpakowywania wartości”, prawdopodobnie nie powinieneś używać Haskell jako przykładu. W językach podobnych do C ++ taki „rozpakowywanie” może być po prostu getterem!
Andres F.,
1
Proponuję usunąć słowo „destruktor” z pytania, zamiast tego użyć „odpakować” i zapytać, czy istnieje ogólna nazwa tego wzoru we wszystkich językach :)
Andres F.,
1
.unapply, lub „ekstraktor” jest z grubsza analogiem w scali, ale może nie ma nazwy, ponieważ w większości przypadków po prostu wzorujesz dopasowanie
Gene T

Odpowiedzi:

5

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.

kamieniste
źródło
1
Ciekawe, jak to samo zmienia się z jednego języka na drugi, jak mapa zamienia się w select w C #, haskell ma fold lisp / java ma redukcję i ruby ​​wstrzykuje, haskell ma scala ma flatmap C # ma selectmany
Jimmy Hoffa
Rzeczywiście nazywa się to dekonstrukcją w kręgach Haskella. Jeśli brzmi to dziwnie, pamiętaj, że Haskell nie ma żadnych obiektów - tylko wartości; Jest więc oczywiste, że termin ten ma inne znaczenie. Najważniejsze jest to, że „dekonstrukcja” jest dokładnie tym, co robi. W tym względzie osobiście uważam, że dekonstruktorzy obiektów należy nazwać czymś podobnym do wywozu obiektów. Jest o wiele bardziej dokładny.
MasterMastic
8

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.

marco-fiset
źródło
1
Zauważ, że użycie przez C ++ / C # / Java terminu „destruktor” nie zgadza się z Haskellem. To samo słowo, różne koncepcje.
Andres F.,
1
@AndresF. Tak, dlatego dodałem zdanie:Maybe in Haskell this does not translate really well but I don't know the language.
marco-fiset,
1
W porządku, usunąłem moją opinię. Myślę, że błędne jest pytanie, które wydaje się zadawać jedno, ale w rzeczywistości zadaje inne! :)
Andres F.,
@AndresF. Tak, pytanie jest mylące. PO pyta 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.
marco-fiset
1
Tylko uwaga, C # ma finalizatory, ale nie destruktory, które są różne, ponieważ finalizatory wykonują niedeterministycznie. Więc może edytuj swoją odpowiedź, aby nie rozpowszechniać błędnej nazwy destruktorów w C #.
Jimmy Hoffa
6

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ą maybei eitherz Preludium.

Pamiętaj, że unwrapw twoim przykładzie może być kilka rzeczy:

  • funkcja (jak każda inna): możesz na przykład zrobić map unwrap [ Wrap 23, Wrap 42 ]; użycie to jest w przybliżeniu równoważne metodzie gettera w OOP.
  • specyfikator pola rekordu w konstrukcji rekordu: let w = Wrap { unwrap = 23 }
  • specyfikator rekord pola w rekordzie działka let w' = w { unwrap = 23 }; jest to podobne do metod ustawiania w OOP (jeśli dużo wyciskasz).
  • specyfikator pola rekordu w dopasowaniu wzorca: 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.

tdammers
źródło
2
Dowody używania terminu „destruktor” w społecznościach Haskell: haskell.org/pipermail/beginners/2010-April/003946.html i mail-archive.com/[email protected]/msg26463.html . „Destruktor” w żargonie Haskell to „odwijarka”, koncepcja całkowicie niezwiązana z zarządzaniem pamięcią lub finalizacją obiektu.
Andres F.,
3
Mój kierownik pracy magisterskiej, który programuje wyłącznie w Haskell, używa również terminu „destruktor” dla odwijacza.
Andres F.,
Cóż, nigdy nie spotkałem się z tym terminem. Masz całkowitą rację, że po zastosowaniu nie ma absolutnie nic wspólnego z koncepcją destruktora w OOP.
tdammers
@AndresF .: Edytowane, aby uhonorować twoje uwagi.
tdammers
@AndresF. Jest to interesujące, ponieważ nigdy też nie słyszałem, by był nazywany niszczycielem, chociaż poza tym, czy nie byłoby również dokładne odwoływać się do niego jako pola rekordu, a technika, którą widzę, nazywała się tam „niszczycielem” jako po prostu dopasowanie wzorca ? Rozumiem, że nazywa się to „destrukcją”, gdy twój mecz rozdziela listę na strzępy, czy to może być termin powiązany, ale w odniesieniu do ADT? Po całej destrukcji lista działa tylko na ADT, taką właśnie jest lista. Mam pojęcie destrukcji z stackoverflow.com/questions/11677806/...
Jimmy Hoffa
2

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

JeffO
źródło
Destruktor w językach podobnych do C ++ wykonuje czynności czyszczenia przed zwolnieniem przydzielonej pamięci. Destruktor w Haskell rozpakowuje wartość z „zewnętrznej warstwy” (nie używasz jej do czyszczenia niczego). Nie są to naprawdę powiązane pojęcia.
Andres F.,
2
Chyba nie zdawałem sobie sprawy, że to pytanie Haskela.
JeffO
Rzeczywiście nie było jasne. Pytanie zostało zmienione i przeformułowane :)
Andres F.,
2

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.

Płomień Pthariena
źródło