Edit: je reformule un peu la question. Apparemment, j'ai causé une certaine confusion parce que je ne savais pas que le terme destructeur est utilisé dans la POO pour quelque chose de tout à fait différent - c'est une fonction invoquée lorsqu'un objet est détruit. Dans la programmation fonctionnelle, nous (essayons) d'éviter l'état mutable, il n'y a donc pas d'équivalent. (J'ai ajouté la balise appropriée à la question.)
Au lieu de cela, j'ai vu que le champ d'enregistrement pour déballer une valeur (en particulier pour les types de données à valeur unique tels que newtype
s) est parfois appelé destructeur ou peut-être déconstructeur . Par exemple, ayons (dans Haskell):
newtype Wrap = Wrap { unwrap :: Int }
Voici Wrap
le constructeur et unwrap
c'est quoi?
Les questions sont:
- Comment appelons-nous
unwrap
en programmation fonctionnelle? Déconstructeur? Destructeur? Ou par un autre terme? - Et pour clarifier, cette / autre terminologie est-elle applicable à d'autres langages fonctionnels , ou est-elle utilisée uniquement dans le Haskell?
- Peut-être aussi, y a-t-il une terminologie pour cela en général, dans les langages non fonctionnels ?
J'ai vu les deux termes, par exemple:
... Le plus souvent, on fournit des constructeurs et des destructeurs intelligents pour faciliter leur travail avec eux. ...
sur le wiki Haskell , ou
... Le thème général ici est de fusionner les paires constructeur - déconstructeur comme ...
au wikibook de Haskell (ici, cela signifie probablement dans un sens un peu plus général), ou
newtype DList a = DL { unDL :: [a] -> [a] }
La fonction unDL est notre déconstructeur , qui supprime le constructeur DL. ...
dans The Real World Haskell .
la source
Réponses:
Il existe plusieurs termes pour le concept. Déconstruire est ce que je crois être courant dans les cercles Haskell, c'est ce que Real World Haskell appelle. Je crois que le terme destructuration (ou destructuring bind) est courant dans les cercles Lisp.
la source
Destructor est le terme utilisé par C ++ et peut-être d'autres langages que je ne connais pas. Ils sont utilisés pour libérer des ressources créées par le constructeur afin qu'ils fassent exactement le contraire. Peut-être que le concept ne se traduit pas littéralement par Haskell, mais le terme semble être utilisé à certains endroits.
EDIT: Compte tenu de votre modification de la question, je l'appellerais alors un déballeur ... J'ai pu répondre à la question d'origine, mais maintenant elle s'est éloignée de mes connaissances, alors ne prenez pas cette modification trop au sérieux.
la source
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?
. À moins que la question ne soit modifiée pour être plus spécifique à un concept Haskell, je laisserai ma réponse telle quelle.Dans la POO, un constructeur est une construction de fonction ou de langage qui crée et initialise un nouvel objet («construit» l'objet), et un destructeur est son double, une fonction ou une construction de langage qui nettoie après l'objet (en libérant toutes les ressources qu'il détient) et le supprime.
Cependant, étant donné que Haskell (contrairement, disons, C ++) a un ramasse-miettes et ne prend pas en charge l'état mutable ou d'autres effets secondaires (du moins pas directement), il n'y a absolument aucune raison pour une notion de destructeur au sens de la POO. De plus, les constructeurs Haskell, contrairement aux constructeurs OOP, ont plus d'applications que la simple création d'objets; ils sont également largement utilisés dans la mise en correspondance de motifs (voir ci-dessous pour un exemple).
Dans votre exemple de code, `` déballer '' est un champ d'enregistrement , et selon la façon dont il est utilisé, je pourrais l'appeler un accesseur , ou peut-être même un getter (bien que ce dernier soit également utilisé dans un contexte d'objectif, il pourrait donc être un peu déroutant).
Je n'ai jamais entendu le terme «destructeur» (ou «déconstructeur») utilisé dans un contexte Haskell moi-même; cependant, comme le note Andres F., il est parfois utilisé pour faire référence à une fonction qui annule l'habillage introduit par un constructeur. À ma connaissance, un récupérateur d'enregistrements peut servir de destructeur, mais il en est de même des fonctions régulières, à condition qu'elles récupèrent une valeur d'un type de données plus complexe. Les exemples incluent
maybe
eteither
du Prélude.Notez que
unwrap
, dans votre exemple, il peut y avoir plusieurs choses:map unwrap [ Wrap 23, Wrap 42 ]
; cette utilisation est à peu près équivalente à une méthode getter dans la POO.let w = Wrap { unwrap = 23 }
let w' = w { unwrap = 23 }
; ceci est similaire aux méthodes de définition dans la POO (si vous serrez beaucoup).f Wrap { unwrap = a } = a
Il est probablement préférable de considérer les constructeurs Haskell comme quelque chose de tout à fait différent des constructeurs OOP. Je vous suggère de (re) lire un bon livre sur le langage de programmation Haskell pour une meilleure compréhension - "Real World Haskell" est vraiment bon, et j'ai entendu de bonnes choses à propos de "Learn You A Haskell" . Les deux devraient avoir de bonnes explications sur les constructeurs et la syntaxe d'enregistrement en particulier.
la source
Je pense que destructeur est le terme plus large. Certains langages comme Java et VB.NET ont un finaliseur. /programming/171952/is-there-a-destructor-for-java
la source
Puisqu'il ne semble pas y avoir de convention multilingue, je les appelle généralement des extracteurs , car c'est le terme que Scala utilise pour cette notion générale, et parce qu'il est peu probable qu'il soit confondu avec une utilisation existante.
la source