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
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
data Bool = True | False
introducimos el tipo `Bool' y los valores `True' y `False' (ambos de tipo `Bool').
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.