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 newtype
s) manchmal als Destruktor oder vielleicht als Dekonstruktor bezeichnet wird . Zum Beispiel haben wir (in Haskell):
newtype Wrap = Wrap { unwrap :: Int }
Hier Wrap
ist der Konstruktor und unwrap
was?
Die Fragen sind:
- Wie rufen wir die
unwrap
funktionale 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. ...
quelle
Antworten:
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.
quelle
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.
quelle
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?
. 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.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
maybe
undeither
aus dem Präludium.Beachten Sie, dass es
unwrap
in Ihrem Beispiel mehrere Dinge geben kann:map unwrap [ Wrap 23, Wrap 42 ]
; Diese Verwendung entspricht in etwa einer Getter-Methode in OOP.let w = Wrap { unwrap = 23 }
let w' = w { unwrap = 23 }
; Dies ähnelt den Setter-Methoden in OOP (wenn Sie viel drücken).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.
quelle
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
quelle
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.
quelle