Was ist der richtige Begriff für eine zu einem Konstruktor inverse Funktion, um einen Wert aus einem Datentyp zu entpacken?

13

Edit: Ich formuliere die Frage ein bisschen um. Anscheinend habe ich einige Verwirrung gestiftet, weil ich nicht begriffen habe, dass der Begriff Destruktor in OOP für etwas ganz anderes verwendet wird - eine Funktion, die aufgerufen wird, wenn ein Objekt zerstört wird. In der funktionalen Programmierung wird versucht, einen veränderlichen Zustand zu vermeiden, so dass es keinen entsprechenden gibt. (Ich habe der Frage das richtige Tag hinzugefügt.)

Stattdessen habe ich gesehen, dass das Datensatzfeld zum Auspacken eines Werts (insbesondere für einwertige Datentypen wie newtypes) manchmal als Destruktor oder vielleicht als Dekonstruktor bezeichnet wird . Zum Beispiel haben wir (in Haskell):

newtype Wrap = Wrap { unwrap :: Int }

Hier Wrapist der Konstruktor und unwrapwas?

Die Fragen sind:

  • Wie rufen wir die unwrapfunktionale Programmierung auf? Dekonstruktor? Zerstörer? Oder nach einem anderen Begriff?
  • Und um zu verdeutlichen, ist diese / andere Terminologie auf andere funktionale Sprachen anwendbar oder wird sie nur in Haskell verwendet?
  • Gibt es vielleicht auch eine Terminologie dafür im Allgemeinen in nicht funktionalen Sprachen ?

Ich habe beide Begriffe gesehen, zum Beispiel:

... Meist liefert man intelligente Konstruktoren und Destruktoren, damit diese einfacher damit arbeiten können. ...

im Haskell Wiki , oder

... Das allgemeine Thema hier ist, Konstruktor- Dekonstruktor- Paare wie ... zu verschmelzen

bei Haskell Wikibook (hier ist es wahrscheinlich etwas allgemeiner gemeint), oder

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

Die unDL-Funktion ist unser Dekonstruktor , der den DL-Konstruktor entfernt. ...

in der realen Welt Haskell .

Petr Pudlák
quelle
3
Destruktor scheint der am häufigsten verwendete Begriff zu sein
Zavior
3
Für Haskell scheint dies eine Spezialität zu sein (ein "Destruktor" in Haskell ist nicht dasselbe Konzept wie in C ++. Die Namensähnlichkeit ist irreführend). Wenn Sie das allgemeine Konzept "Auspacken eines Werts" möchten, sollten Sie Haskell wahrscheinlich nicht als Beispiel verwenden. In C ++ - ähnlichen Sprachen kann ein solcher "Unwrapper" einfach ein Getter sein!
Andres F.
1
Ich schlage vor, Sie entfernen das Wort "Destruktor" aus der Frage, verwenden stattdessen "Unwrapper" und fragen, ob es einen allgemeinen Namen für dieses Muster in verschiedenen Sprachen gibt :)
Andres F.
1
.unapply oder "extractor" ist eine grobe Entsprechung in Scala, aber vielleicht gibt es keinen Namen, weil in den meisten Fällen Sie einfach Musterübereinstimmung
Gene T

Antworten:

5

Es gibt mehrere Begriffe für das Konzept. Dekonstruieren ist das, was meiner Meinung nach in Haskell-Kreisen üblich ist, wie es die reale Welt Haskell nennt. Ich glaube, der Begriff Destrukturierung (oder Destrukturierungsbindung) ist in Lisp-Kreisen weit verbreitet.

Steinmetalle
quelle
1
Interessant ist, wie das Gleiche von einer Sprache zur nächsten einen anderen Begriff bekommt, wie Map in Select in C # verwandelt wird, Haskell Lisp gefoldet hat / Java reduziert und Ruby injiziert hat, Haskell Scala gebunden hat, Flatmap C # ausgewählt hat
Jimmy Hoffa
In den Haskell-Kreisen wird das Dekonstruktion genannt. Wenn es seltsam klingt, denken Sie daran, dass Haskell keine Objekte hat - nur Werte. Es versteht sich also von selbst, dass der Begriff eine andere Bedeutung hat. Der große Teil ist, dass "Dekonstruktion" genau das ist, was es tut. In diesem Sinne denke ich, dass Objekt-Dekonstruktoren so etwas wie Objekt-Disponenten heißen sollten. Es ist viel, viel genauer.
MasterMastic
8

Destruktor ist der Begriff, der von C ++ und vielleicht anderen Sprachen verwendet wird, die ich nicht kenne. Sie werden verwendet, um vom Konstruktor erstellte Ressourcen freizugeben, sodass genau das Gegenteil erreicht wird. Vielleicht übersetzt sich das Konzept nicht wörtlich auf Haskell, aber der Begriff scheint an einigen Stellen verwendet zu werden.

EDIT: In Anbetracht Ihrer Bearbeitung der Frage würde ich sie dann als Unwrapper bezeichnen ... Ich konnte die ursprüngliche Frage beantworten, aber jetzt hat sie mein Wissen verlassen. Nehmen Sie diese Bearbeitung also nicht zu ernst.

Marco-Fiset
quelle
1
Beachten Sie, dass die Verwendung des Begriffs "Destruktor" in C ++ / C # / Java nicht mit der von Haskell übereinstimmt. Gleiches Wort, unterschiedliche Konzepte.
Andres F.
1
@AndresF. Ja, deshalb habe ich den Satz hinzugefügt:Maybe in Haskell this does not translate really well but I don't know the language.
marco-fiset
1
Fairerweise habe ich meine Ablehnung entfernt. Ich denke, was falsch ist, ist die eigentliche Frage, die eine Sache zu stellen scheint, aber tatsächlich eine andere fragt! :)
Andres F.
@AndresF. Ja, die Frage ist irreführend. Die OP fragt: What's the proper term for a function inverse to a constructor?. Sofern die Frage nicht so bearbeitet wird, dass sie sich auf ein bestimmtes Haskell-Konzept bezieht, werde ich meine Antwort so lassen, wie sie ist.
Marco-Fiset
1
Nur eine Anmerkung, C # hat Finalizer, aber keine Destruktoren, die sich unterscheiden, weil Finalizer eine nicht deterministische Ausführung haben. Bearbeiten Sie also möglicherweise Ihre Antwort, um die falsche Bezeichnung der Destruktoren in C # nicht zu verbreiten.
Jimmy Hoffa
6

In OOP ist ein Konstruktor ein Funktions- oder Sprachkonstrukt, das ein neues Objekt erstellt und initialisiert (das Objekt 'konstruiert'), und ein Destruktor ist sein duales Funktions- oder Sprachkonstrukt, das nach dem Objekt bereinigt (indem es Ressourcen freigibt) hält) und löscht es.

Da Haskell (anders als beispielsweise C ++) über Garbage Collection verfügt und keinen veränderlichen Status oder andere Nebenwirkungen (zumindest nicht direkt) unterstützt, gibt es absolut keinen Grund für einen Destruktor-Begriff im Sinne von OOP. Außerdem haben Haskell-Konstruktoren im Gegensatz zu OOP-Konstruktoren mehr Anwendungen als nur die Objekterstellung. Sie werden auch häufig beim Pattern Matching verwendet (siehe unten für ein Beispiel).

In Ihrem Codebeispiel ist "Unwrap" ein Datensatzfeld , und je nachdem, wie es verwendet wird, kann ich es als Accessor oder sogar als Getter bezeichnen (obwohl letzteres auch in einem Linsenkontext verwendet wird, so könnte es sein eigentlich etwas verwirrend sein).

Ich habe den Begriff "Destruktor" (oder "Dekonstruktor"), der in einem Haskell-Kontext verwendet wird, noch nie gehört. wie Andres F. bemerkt, wird es jedoch manchmal verwendet, um auf eine Funktion zu verweisen, die den von einem Konstruktor eingeführten Umbruch rückgängig macht. Nach meinem Verständnis kann ein Record Getter als Destruktor dienen, aber auch reguläre Funktionen, vorausgesetzt, sie erhalten einen Wert aus einem komplexeren Datentyp zurück. Beispiele hierfür sind maybeund eitheraus dem Präludium.

Beachten Sie, dass es unwrapin Ihrem Beispiel mehrere Dinge geben kann:

  • eine Funktion (wie jede andere): Sie können zum Beispiel tun map unwrap [ Wrap 23, Wrap 42 ]; Diese Verwendung entspricht in etwa einer Getter-Methode in OOP.
  • Ein Datensatzfeldspezifizierer in einer Datensatzkonstruktion: let w = Wrap { unwrap = 23 }
  • ein Rekord Feldspezifizierer in einem Datensatz Update: let w' = w { unwrap = 23 }; Dies ähnelt den Setter-Methoden in OOP (wenn Sie viel drücken).
  • Ein Datensatz-Feldbezeichner für den Mustervergleich: f Wrap { unwrap = a } = a

Es ist wahrscheinlich am besten, sich Haskell-Konstruktoren als etwas ganz anderes als OOP-Konstruktoren vorzustellen. Ich schlage vor, dass Sie zum besseren Verständnis ein gutes Buch über die Programmiersprache Haskell (erneut) lesen - "Real World Haskell" ist wirklich gut, und ich habe gute Dinge über "Learn You A Haskell" gehört . Beide sollten gute Erklärungen zu Konstruktoren und insbesondere zur Datensatzsyntax haben.

tdammers
quelle
2
Hinweise auf die Verwendung des Begriffs "Destruktor" in Haskell-Communities: haskell.org/pipermail/beginners/2010-April/003946.html und mail-archive.com/[email protected]/msg26463.html . Ein "Destruktor" in Haskell-Jargon ist ein "Unwrapper", ein Konzept, das in keiner Beziehung zur Speicherverwaltung oder zur Finalisierung von Objekten steht.
Andres F.
3
Mein Dissertationsleiter, der ausschließlich in Haskell programmiert, verwendet für einen Unwrapper auch den Begriff "Destruktor".
Andres F.
Nun, ich war nie auf den Begriff gestoßen. Sie haben völlig Recht, dass es bei der Verwendung absolut nichts mit dem Destruktor-Konzept in OOP zu tun hat.
tdammers
@AndresF .: Bearbeitet, um Ihre Bemerkungen zu würdigen.
tdammers
@AndresF. Dies ist interessant, da ich auch noch nie gehört habe, dass es sich um einen Destruktor handelt. Abgesehen davon, wäre es nicht auch genau, wenn man es nur als Aufnahmefeld bezeichnet und die Technik, die ich dort als "Destruktor" bezeichne, als Musterübereinstimmung ? Ich verstehe, dass es "destructuring" heißt, wenn Ihr Match eine Liste auseinander zieht. Ist dies vielleicht ein verwandter Begriff, aber in Bezug auf einen ADT? Nach allem, was eine Liste destrukturiert, wirkt
Jimmy Hoffa,
2

Ich denke, Destruktor ist der umfassendere Begriff. Einige Sprachen wie Java und VB.NET haben einen Finalizer. /programming/171952/is-there-a-destructor-for-java

JeffO
quelle
Ein Destruktor in C ++ - ähnlichen Sprachen führt Bereinigungsaktionen durch, bevor der zugewiesene Speicher freigegeben wird. Ein Destruktor in Haskell packt einen Wert aus seiner "äußeren Ebene" aus (Sie verwenden ihn nicht, um etwas aufzuräumen). Sie sind keine wirklich verwandten Konzepte.
Andres F.
2
Ich glaube, ich wusste nicht, dass dies eine Haskel-Frage ist.
JeffO
Es war in der Tat nicht klar. Die Frage wurde nun umgetaggt und umformuliert :)
Andres F.
2

Da es keine sprachübergreifenden Konventionen zu geben scheint, bezeichne ich sie normalerweise als Extraktoren , da dies der Begriff ist, den Scala für diesen allgemeinen Begriff verwendet, und weil es nicht wahrscheinlich ist, dass er mit einer vorhandenen Verwendung verwechselt wird.

Pthariens Flamme
quelle