¿Cuál es el término adecuado 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 un objeto está siendo destruido. En la programación funcional, nosotros (intentamos) evitar el estado mutable para que no haya tal equivalente. (Agregué la etiqueta adecuada a la pregunta).

En cambio, he visto que el campo de registro para desenvolver un valor (especialmente para los tipos de datos de valor único como newtype s) a veces se llama destructor o tal vez deconstructor . Por ejemplo, tengamos (en Haskell):

newtype Wrap = Wrap { unwrap :: Int }

Aquí Wrap es el constructor y unwrap es qué?

Las preguntas son:

  • ¿Cómo llamamos a unwrap en la programación funcional? ¿Deconstructor? ¿Incinerador de basuras? ¿O por algún otro término?
  • Y para aclarar, ¿es esta / otra terminología aplicable a otros lenguajes funcionales , o se usa solo en Haskell?
  • Quizás también, ¿existe 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 inteligentes y destructores para que estos puedan trabajar fácilmente con ellos. ...

en wiki de Haskell , o

  

... El tema general aquí es fusionar constructor - deconstructor pares como ...

en Haskell wikibook (aquí probablemente se refiera en un sentido más general), o

newtype DList a = DL { unDL :: [a] -> [a] }
     

La función unDL es nuestro deconstructor , que elimina el constructor DL. ...

en The Real World Haskell .

    
pregunta Petr Pudlák 12.10.2012 - 14:18

5 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 como lo llama Real World Haskell. Creo que el término desestructuración (o vinculación de desestructuración) es común en los círculos Lisp.

    
respondido por el stonemetal 12.10.2012 - 17:19
8

Destructor es el término usado por C ++ y quizás otros idiomas que no conozco. Se utilizan para liberar recursos creados por el constructor, de modo que hacen exactamente lo contrario. Quizás el concepto no se traduce literalmente a Haskell, pero el término parece ser usado en algunos lugares.

EDITAR: considerando su edición a la pregunta, lo llamaría un desempaquetador entonces ... Pude responder la pregunta original, pero ahora se ha alejado de mi conocimiento, así que no se tome esta edición muy en serio. / p>     

respondido por el marco-fiset 12.10.2012 - 14:26
6

En POO, un constructor es una función o construcción de lenguaje que crea e inicializa un nuevo objeto ('construye' el objeto), y un destructor es su dual, una función o construcción de lenguaje que se limpia después del objeto (al soltar cualquier recurso que posea) y lo elimina.

Sin embargo, dado que Haskell (a diferencia de, digamos, C ++) tiene recolección de basura y no admite 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 de OOP. Además, los constructores de Haskell, a diferencia de los constructores OOP, tienen más aplicaciones que solo la creación de objetos; también se utilizan mucho en la coincidencia de patrones (vea un ejemplo a continuación).

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 elemento de acceso , o tal vez un getter (aunque este último también se usa en un contexto de lente, por lo que podría ser un poco confuso).

Nunca he escuchado el término 'destructor' (o 'deconstructor') utilizado en un contexto de Haskell; Sin embargo, como señala Andrés F., a veces se usa para referirse a una función que deshace el ajuste introducido por un constructor. A mi entender, un recopilador de registros puede servir como un destructor, pero también las funciones regulares, siempre que obtengan un valor de un tipo de datos más complejo. Los ejemplos incluyen maybe y either del Preludio.

Tenga en cuenta que unwrap , en su ejemplo, puede ser varias cosas:

  • una función (como cualquier otra): puede, por ejemplo, hacer map unwrap [ Wrap 23, Wrap 42 ] ; este uso es aproximadamente 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 aprietas mucho).
  • un especificador de campo de registro en coincidencia de patrón: f Wrap { unwrap = a } = a

Probablemente es mejor pensar en los constructores de Haskell como algo totalmente diferente de los constructores OOP. Le sugiero que (re) lea un buen libro sobre el lenguaje de programación de Haskell para una mejor comprensión: "Haskell del mundo real" es realmente bien, 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.

    
respondido por el tdammers 12.10.2012 - 16:17
2

Creo que destructor es el término más amplio. Algunos lenguajes como Java y VB.NET tienen un finalizador. enlace

    
respondido por el JeffO 12.10.2012 - 14:28
2

Ya que no parece haber ninguna convención entre idiomas, generalmente los llamo extractors , porque ese es el término que Scala usa para esa noción general, y porque no es probable que se confunda con cualquier uso existente.

    
respondido por el Ptharien's Flame 12.10.2012 - 21:04

Lea otras preguntas en las etiquetas