¿Cuál es el término apropiado para una función inversa a un constructor, para desenvolver un valor de un tipo de datos?


13

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 newtypes) a veces se denomina destructor o quizás deconstructor . Por ejemplo, tengamos (en Haskell):

newtype Wrap = Wrap { unwrap :: Int }

Aquí Wrapestá el constructor y unwrap¿qué es?

Las preguntas son:

  • ¿Cómo llamamos unwrapa 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. ...

en el mundo real Haskell .


3
Destructor parece ser el término más utilizado
Zavior

3
Esto parece especializado para Haskell (un "destructor" en Haskell no es el mismo concepto que en C ++. La similitud del nombre es engañosa). Si desea el concepto general de "desenvolver un valor", probablemente no debería usar Haskell como ejemplo. En lenguajes similares a C ++, ¡tal "desenvoltura" puede ser simplemente un captador!
Andres F.

1
Le sugiero que elimine la palabra "destructor" de la pregunta, use "desenvolver" en su lugar y pregunte si hay un nombre general para este patrón en todos los idiomas :)
Andres F.

1
.unapply, o "extractor" es un análogo aproximado en scala, pero tal vez no haya nombre porque en la mayoría de los casos simplemente coincide con el patrón
Gene T

Respuestas:


5

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.


1
Interesante cómo la misma cosa obtiene un término diferente de un idioma a otro, como el mapa se convierte en select en C #, haskell se ha plegado lisp / java se ha reducido y ruby ​​se ha inyectado, haskell se ha unido scala tiene mapa plano C # tiene selectmany
Jimmy Hoffa

De hecho, se llama deconstrucción en los círculos de Haskell. Si suena extraño, tenga en cuenta que Haskell no tiene objetos, solo valores; Por lo tanto, no hace falta decir que el término tiene un significado diferente. La gran parte es que la 'deconstrucción' es exactamente lo que hace. En esa nota, personalmente creo que los deconstructores de objetos deberían llamarse algo similar a los trituradores. Es mucho, mucho más preciso.
MasterMastic

8

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.


1
Tenga en cuenta que el uso de C ++ / C # / Java del término "destructor" no coincide con el de Haskell. La misma palabra, diferentes conceptos.
Andres F.

1
@AndresF. Sí, por eso agregué la oración:Maybe in Haskell this does not translate really well but I don't know the language.
marco-fiset

1
Muy bien, eliminé mi voto negativo. Creo que lo que está equivocado es la pregunta real, que parece estar haciendo una cosa, ¡pero en realidad está haciendo otra! :)
Andres F.

@AndresF. Sí, la pregunta es engañosa. El PO pregunta: 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á.
marco-fiset

1
Solo una nota, C # tiene finalizadores pero no destructores, que son diferentes porque los finalizadores tienen una ejecución no determinista. Entonces, tal vez edite su respuesta para no difundir el nombre inapropiado de destructores en C #.
Jimmy Hoffa

6

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 maybey eitherdel preludio.

Tenga unwrapen cuenta que , en su ejemplo, puede haber varias cosas:

  • una función (como cualquier otra): puede, por ejemplo, hacer map unwrap [ Wrap 23, Wrap 42 ]; este uso es más o menos equivalente a un método getter en OOP.
  • un especificador de campo de registro en una construcción de registro: let w = Wrap { unwrap = 23 }
  • un especificador de campo de registro en una actualización de registro: let w' = w { unwrap = 23 }; Esto es similar a los métodos de establecimiento en OOP (si aprieta mucho).
  • un especificador de campo de registro en coincidencia de patrones: 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.


2
Evidencia del uso del término "destructor" en las comunidades Haskell: haskell.org/pipermail/beginners/2010-April/003946.html y mail-archive.com/haskell-cafe@haskell.org/msg26463.html . Un "destructor" en la jerga de Haskell es un "desempacador", un concepto totalmente ajeno a la gestión de memoria o la finalización de objetos.
Andres F.

3
El director de mi tesis, que programa exclusivamente en Haskell, también usa el término "destructor" para un contenedor.
Andres F.

Bueno, nunca había encontrado el término. Tiene toda la razón en que, cuando se usa, no tiene absolutamente nada que ver con el concepto de destructor en OOP.
tdammers

@AndresF .: Editado para honrar sus comentarios.
tdammers

@AndresF. Esto es interesante ya que nunca lo escuché referirse como un destructor, aunque aparte de eso, ¿no sería preciso también referirse a él como un campo de registro, y la técnica que veo llamado "destructor" allí como solo una coincidencia de patrón ? Entiendo que se llama "desestructuración" cuando su coincidencia está separando una lista, ¿es acaso un término relacionado pero en referencia a un ADT? Después de todo, la desestructuración de una lista solo está actuando en un ADT, ya que eso es lo que es una lista. Obtuve el término desestructuración de stackoverflow.com/questions/11677806/…
Jimmy Hoffa

2

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


Un destructor en lenguajes similares a C ++ realiza acciones de limpieza antes de liberar la memoria asignada. Un destructor en Haskell desenvuelve un valor de su "capa externa" (no lo usa para limpiar nada). No son conceptos verdaderamente relacionados.
Andres F.

2
Supongo que no me di cuenta de que esta es una pregunta de Haskel.
JeffO

No estaba claro de hecho. La pregunta ahora se ha vuelto a etiquetar y reformular :)
Andres F.

2

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.