Quel est le terme approprié pour une fonction inverse d'un constructeur - pour déballer une valeur d'un type de données?


13

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 newtypes) est parfois appelé destructeur ou peut-être déconstructeur . Par exemple, ayons (dans Haskell):

newtype Wrap = Wrap { unwrap :: Int }

Voici Wraple constructeur et unwrapc'est quoi?

Les questions sont:

  • Comment appelons-nous unwrapen 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 .


3
Destructor semble être le terme le plus utilisé
Zavior

3
Cela semble spécialisé pour Haskell (un "destructeur" dans Haskell n'est pas le même concept qu'en C ++. La similitude du nom est trompeuse). Si vous voulez le concept général de "déballer une valeur", vous ne devriez probablement pas utiliser Haskell comme exemple. Dans les langages de type C ++, un tel "wrapper" peut être simplement un getter!
Andres F.

1
Je vous suggère de supprimer le mot "destructeur" de la question, d'utiliser plutôt "unwrapper" et de demander s'il existe un nom général pour ce modèle dans toutes les langues :)
Andres F.

1
.unapply, ou "extractor" est un analogue approximatif dans scala, mais peut-être qu'il n'y a pas de nom parce que dans la plupart des cas, vous faites simplement correspondre le modèle
Gene T

Réponses:


5

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.


1
Intéressant de voir comment la même chose obtient un terme différent d'une langue à l'autre, comme la carte se transforme en sélectionner en C #, haskell a fold lisp / java a réduire et ruby ​​a injecter, haskell a bind scala a flatmap C # has selectmany
Jimmy Hoffa

Cela s'appelle en effet la déconstruction dans les cercles Haskell. Si cela semble étrange, gardez à l'esprit que Haskell n'a pas d'objets - juste des valeurs; Il va donc sans dire que le terme a un sens différent. La grande partie est que la «déconstruction» est exactement ce qu'elle fait. Sur cette note, je pense personnellement que les déconstructeurs d'objets devraient être appelés quelque chose comme les dispositifs d'élimination d'objets. C'est beaucoup, beaucoup plus précis.
MasterMastic

8

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.


1
Notez que l'utilisation du terme "destructeur" par C ++ / C # / Java ne correspond pas à celle de Haskell. Même mot, différents concepts.
Andres F.

1
@AndresF. Oui, c'est pourquoi j'ai ajouté la phrase:Maybe in Haskell this does not translate really well but I don't know the language.
marco-fiset

1
Assez juste, j'ai supprimé mon downvote. Je pense que ce qui est erroné, c'est la vraie question, qui semble demander une chose, mais en fait en demander une autre! :)
Andres F.

@AndresF. Oui, la question est trompeuse. L'OP demande: 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.
marco-fiset

1
Juste une note, C # a des finaliseurs mais pas des destructeurs, qui sont différents parce que les finaliseurs ont une exécution non déterministe. Alors peut-être modifiez votre réponse pour ne pas répandre le terme impropre des destructeurs en C #.
Jimmy Hoffa

6

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 maybeeteither du Prélude.

Notez que unwrap, dans votre exemple, il peut y avoir plusieurs choses:

  • une fonction (comme n'importe quelle autre): vous pouvez, par exemple, faire map unwrap [ Wrap 23, Wrap 42 ]; cette utilisation est à peu près équivalente à une méthode getter dans la POO.
  • un spécificateur de champ d'enregistrement dans une construction d'enregistrement: let w = Wrap { unwrap = 23 }
  • un spécificateur de champ d'enregistrement dans une mise à jour d'enregistrement: let w' = w { unwrap = 23 } ; ceci est similaire aux méthodes de définition dans la POO (si vous serrez beaucoup).
  • un spécificateur de champ d'enregistrement en correspondance de modèle: 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.


2
Preuve de l'utilisation du terme "destructeur" dans les communautés Haskell: haskell.org/pipermail/beginners/2010-April/003946.html et mail-archive.com/haskell-cafe@haskell.org/msg26463.html . Un "destructeur" dans le jargon Haskell est un "dérouleur", un concept totalement indépendant de la gestion de la mémoire ou de la finalisation d'objet.
Andres F.

3
Mon directeur de thèse, qui programme exclusivement en Haskell, utilise également le terme «destructeur» pour un déballeur.
Andres F.

Eh bien, je n'avais jamais rencontré le terme. Vous avez tout à fait raison de dire que, lorsqu'il est utilisé, cela n'a absolument rien à voir avec le concept de destructeur dans la POO.
tdammers

@AndresF.: Édité pour honorer vos remarques.
tdammers

@AndresF. Ceci est intéressant car je ne l'ai jamais entendu parler de destructeur, bien que cela mis à part, ne serait-il pas également exact de le désigner uniquement comme un champ d'enregistrement, et la technique que je vois appelée "destructeur" là-bas n'est qu'une correspondance de modèle ? Je comprends que cela s'appelle "déstructuration" lorsque votre match tire une liste à part, est-ce peut-être un terme connexe mais en référence à un ADT? Après tout, la déstructuration d'une liste agit simplement sur un ADT car c'est ce qu'est une liste .. J'ai obtenu le terme déstructuration de stackoverflow.com/questions/11677806/…
Jimmy Hoffa

2

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


Un destructeur dans des langages de type C ++ effectue des actions de nettoyage avant de libérer la mémoire allouée. Un destructeur dans Haskell déballe une valeur de sa "couche externe" (vous ne l'utilisez pas pour nettoyer quoi que ce soit). Ce ne sont pas des concepts vraiment liés.
Andres F.

2
Je suppose que je ne savais pas que c'était une question Haskel.
JeffO

Ce n'était pas clair en effet. La question a maintenant été reformulée et reformulée :)
Andres F.

2

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.