Constructor (programación funcional)

En teoría de tipos y lenguajes de programación funcional, un constructor de tipos de datos algebraicos, o simplemente un constructor , es una función con un cuerpo vacío que construye un objeto de tipos de datos algebraicos . Los compiladores de optimización ejecutan estas funciones de forma estática, es decir, en tiempo de compilación .

Los tipos de datos algebraicos son un elemento importante de los lenguajes tipificados Hindley-Milner .

Ejemplo

La estructura más simple de un documento XML en Standard ML se puede definir de la siguiente manera:

tipo de datos simple_xml = Vacío | palabra de cadena | Etiquetado de cadena * lista simple_xml

Esta es la definición de un tipo de datos algebraicos . Introduce cuatro identificadores en el programa: un constructor de tipo simple_xml nulo y tres constructores de objetos de este tipo algebraico: nullary Empty , unary Wordy binary Tagged. Este último toma dos parámetros (en este caso como una tupla ), el segundo de los cuales tiene un tipo simple_xml list(es decir, una lista de objetos del tipo definido aquí). Por lo tanto, simple_xmles un tipo de datos recursivo .

Los constructores tienen todos los derechos de las funciones (por ejemplo, un constructor Wordtiene un tipo de función " string -> simple_xml") y, en particular, se pueden utilizar en la abstracción de funciones .

fun listOfWords s = map Word ( String . tokens Char . isSpace s ) fun toString e = let val scat = String . concat en caso e de Vacío => "" | Palabra s => s ^ " " | Etiquetado ( etiqueta , contenido ) => scat [ "<" , etiqueta , ">" , scat ( asignar aString contenido ), "</" , etiqueta , ">" ] fin

En el cuerpo de la función listOfWords, puedes ver como el constructor se Wordpasa como parámetro a la función map, y lo aplica a cada elemento de la lista de cadenas que recibe como segundo parámetro. La lista de cadenas, a su vez, se obtiene tokenizando (en este caso, simplemente dividiendo en palabras) la cadena que la función recibió como listOfWordsparámetro de entrada.

Cada aplicación de un constructor Worda un objeto de tipo "cadena" produce un objeto de tipo simple_xml. Estos objetos secundarios luego se usan para crear una lista (esto sucede dentro de map), por lo que el resultado de la función listOfWordsserá una lista de objetos de tipo simple_xml. Esto se confirma por su tipo de función , que el compilador infierestring -> simple_xml list : " ". En consecuencia, el resultado de la función se puede usar directamente como parámetro para otro constructor de este tipo, Tagged que creará un nuevo objeto de tipo simple_xml:

divertido mkXmlFile s = Etiquetado ( "principal" , lista de palabras s )

Por lo tanto, un documento XML se construye mediante la composición recursiva de constructores de tipos algebraicos (de ahí el nombre de " tipo de datos recursivos "). Por ejemplo, tal documento

<main> Aquí hay algo de texto </main>

estará representado en el programa por la siguiente estructura de datos :

Etiquetado ( "principal" , [ Palabra "Aquí" , Palabra "es" , Palabra "algunos" , Palabra "texto" ] )

Esta entrada combina el uso de dos tipos de constructores: simple_xmly list. La sintaxis " " [ , , ]que construye una lista es en realidad azúcar sintáctica sobre una cadena de constructores de tipos list:

Etiquetado ( "principal" , Palabra "Aquí" :: Palabra "es" :: Palabra "algunos" :: Palabra "texto" :: nil )

Aunque el tipo listestá integrado en todos los lenguajes de tipo XM , se define formalmente como un tipo de datos recursivo un constructor nulo nily un constructor binario consque generalmente tiene un nombre simbólico infijo (dos dos puntos en los dialectos clásicos de ML o uno en Haskell ):

tipo de datos ' una lista = nil | :: de ' a * ' una lista infixr 5 ::

Véase también

Literatura

  • Ricardo Pucella. Notas sobre el estándar de programación ML de Nueva Jersey (  (inglés) ) // Última revisión el 10 de enero de 2001. - Universidad de Cornell, 2001.