Editar: estoy reformulando un poco la pregunta. Aparentemente, causé cierta confusión porque no me di cuenta de que el término destructor se usa en OOP para algo bastante diferente: es una función invocada cuando se destruye un objeto. En la programación funcional (intentamos) evitar el estado mutable, por lo que no existe tal equivalente. (Agregué la etiqueta adecuada a la pregunta).
En cambio, he visto que el campo de registro para desenvolver un valor (especialmente para tipos de datos de valor único como newtype
s) a veces se denomina destructor o quizás deconstructor . Por ejemplo, tengamos (en Haskell):
newtype Wrap = Wrap { unwrap :: Int }
Aquí Wrap
está el constructor y unwrap
¿qué es?
Las preguntas son:
- ¿Cómo llamamos
unwrap
a la programación funcional? Deconstructor? ¿Incinerador de basuras? ¿O por algún otro término? - Y para aclarar, ¿esta / otra terminología es aplicable a otros lenguajes funcionales , o se usa solo en Haskell?
- Quizás también, ¿hay alguna terminología para esto en general, en lenguajes no funcionales ?
He visto ambos términos, por ejemplo:
... En la mayoría de los casos, uno suministra constructores y destructores inteligentes para facilitar el trabajo con ellos. ...
en la wiki de Haskell , o
... El tema general aquí es fusionar pares constructor - deconstructor como ...
en el wikibook de Haskell (aquí probablemente se entiende en un sentido un poco más general), o
newtype DList a = DL { unDL :: [a] -> [a] }
La función unDL es nuestro deconstructor , que elimina el constructor DL. ...
fuente
Respuestas:
Hay varios términos para el concepto. Deconstruir es lo que creo que es común en los círculos de Haskell, es lo que el mundo real Haskell llama. Creo que el término desestructuración (o enlace de desestructuración) es común en los círculos de Lisp.
fuente
Destructor es el término utilizado por C ++ y quizás otros lenguajes que no conozco. Se utilizan para liberar recursos creados por el constructor para que hagan exactamente lo contrario. Tal vez el concepto no se traduzca literalmente a Haskell, pero el término parece usarse en algunos lugares.
EDITAR: Teniendo en cuenta su edición de la pregunta, lo llamaría un desempaquetado ... Pude responder la pregunta original pero ahora se ha alejado de mi conocimiento, así que no tome esta edición demasiado en serio.
fuente
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?
. A menos que la pregunta se edite para ser más específica a algún concepto de Haskell, dejaré mi respuesta tal como está.En OOP, un constructor es una construcción de función o lenguaje que crea e inicializa un nuevo objeto ('construye' el objeto), y un destructor es su construcción dual, una función o lenguaje que se limpia después del objeto (al liberar cualquier recurso mantiene) y lo elimina.
Sin embargo, dado que Haskell (a diferencia, por ejemplo, C ++) tiene recolección de basura y no es compatible con el estado mutable u otros efectos secundarios (al menos no directamente), no hay absolutamente ninguna razón para una noción de destructor en el sentido OOP. Además, los constructores Haskell, a diferencia de los constructores OOP, tienen más aplicaciones que solo la creación de objetos; también se usan mucho en la coincidencia de patrones (ver más abajo para un ejemplo).
En su ejemplo de código, 'desenvolver' es un campo de registro , y dependiendo de cómo se use, podría referirme a él como un accesorio , o tal vez incluso un captador (aunque este último también se usa en un contexto de lente, por lo que podría en realidad sea un poco confuso).
Nunca escuché el término 'destructor' (o 'deconstructor') usado en un contexto de Haskell; Como señala Andrés F., sin embargo, a veces se usa para referirse a una función que deshace el ajuste introducido por un constructor. Según tengo entendido, un recopilador de registros puede servir como destructor, pero también las funciones regulares, siempre que recuperen un valor de un tipo de datos más complejo. Los ejemplos incluyen
maybe
yeither
del preludio.Tenga
unwrap
en cuenta que , en su ejemplo, puede haber varias cosas:map unwrap [ Wrap 23, Wrap 42 ]
; este uso es más o menos equivalente a un método getter en OOP.let w = Wrap { unwrap = 23 }
let w' = w { unwrap = 23 }
; Esto es similar a los métodos de establecimiento en OOP (si aprieta mucho).f Wrap { unwrap = a } = a
Probablemente sea mejor pensar en los constructores de Haskell como algo completamente diferente de los constructores de OOP. Le sugiero que (re) lea un buen libro sobre el lenguaje de programación Haskell para una mejor comprensión: "Real World Haskell" es realmente bueno, y he escuchado cosas buenas sobre "Learn You A Haskell" . Ambos deben tener buenas explicaciones sobre los constructores y la sintaxis de registro en particular.
fuente
Creo que destructor es el término más amplio. Algunos lenguajes como Java y VB.NET tienen un finalizador. /programming/171952/is-there-a-destructor-for-java
fuente
Como no parece haber ninguna convención entre idiomas, generalmente los llamo extractores , porque ese es el término que Scala usa para esa noción general, y porque no es probable que se confunda con ningún uso existente.
fuente