Duda sobre definición de data

Duda sobre definición de data

de German Moreira Bellini -
Número de respuestas: 1

Buenas, tengo una duda de como se define un tipo de dato, por ejemplo he visto definiciones como las siguientes:

data T1 = C1

data T2 = T2 Bool

No me queda muy claro porque a veces al comienzo de la parte derecha va el nombre del data que se esta definiendo, y a veces no.
Saludos y gracias de antemano.

En respuesta a German Moreira Bellini

Re: Duda sobre definición de data

de Juan Pablo García Garland -
Hola.

El nombre que aparece del lado izquierdo es el nombre del tipo de datos que estás definiendo, eso es un tipo. Los nombres en mayúsculas de la derecha son constructores y son valores.
 
Cuando definimos por ejemplo:
 
data Bool = True | False

introducimos el tipo `Bool' y los valores `True' y `False' (ambos de tipo `Bool').

 
Cuando definimos, por ejemplo:
 
data IntOrChar = I Int | C Char

introducimos el tipo `IntOrChar' y los constructores `I' y `C' (donde `I :: Int -> IntOrChar', y `C:: Char -> IntOrChar').

 

Como los tipos y los valores `no se mezclan'  (son lenguajes separados, siempre se sabe por el contexto si un nombre es un tipo o un valor) los nombres pueden reutilizarse.

Lo siguiente es legal:

data T1 = T1 | T2

en este caso se introduce el tipo `T1' y los constructores `T1 :: T1' y `T2 :: T1'.

 

Un patrón super común en los programas Haskell, es usar el mismo nombre de tipo cuando tenemos tipos con un único constructor, como por ejemplo el que tu definiste:

data T2 = T2 Bool

Algunos programadores también usan el prefijo `Mk` para hacer énfasis en que es un constructor:

data T2 = MkT2 Bool

En resumen: No hay ninguna relación a nivel de la definición del lenguaje entre el nombre de un tipo y sus constructores. Lo que ocurre es que se pueden reutilizar porque son espacios de nombres separados, y la reutilización es una pragmática común en la comunidad de programadores.