nombre para un tipo existente. type Asignatura= [String] matriculado :: Asignatura matriculado = ["rosa","marcela","luis"] Main> matriculado ["rosa","marcela","luis"] Lic. Wilber Ramos Lovn Definicin de Tipos Enumerados data Dias = Lunes|Martes|Mircoles|Jueves|Viernes|Sba do|Domingo deriving Show laborables =[Lunes,Martes,Mircoles,Jueves,Viernes] Main> :t laborables laborables :: [Dias] Main> laborables [Lunes,Martes,Mircoles,Jueves,Viernes] Lic. Wilber Ramos Lovn Das es un constructor de Tipos La clusula deriving Show es necesaria para que Hugs pueda mostrar por pantalla los valores del tipo finSemana :: Das -> Bool finSemana Sbado = True finSemana Domingo= True finSemana _ = False Main> finSemana Martes False Lic. Wilber Ramos Lovn Podemos definir nuevos Tipos uniendo dos tipos existentes data LetraEntero = Letra Char |Entero Int deriving Show listaMixta=[Letra 'a', Letra 'f',Entero 3,Letra 'p', Entero 8] Main> :t listaMixta listaMixta :: [LetraEntero] Main> listaMixta [Letra 'a',Letra 'f',Entero 3,Letra 'p',Entero 8] Lic. Wilber Ramos Lovn Productos data Racional = Quebrado Int Int deriving Show Main> :t Quebrado Quebrado :: Int -> Int -> Racional numerador :: Racional -> Int numerador (Quebrado x _) = x denominador :: Racional -> Int denominador (Quebrado _ y) = y Lic. Wilber Ramos Lovn Main> numerador ( Quebrado 3 8) 3 Main> denominador ( Quebrado 5 7) 7 por :: Racional -> Racional -> Racional por (Quebrado a b) (Quebrado c d) = Quebrado (a*c) (b*d) Main> por (Quebrado 2 3) (Quebrado 4 5) Quebrado 8 15 Lic. Wilber Ramos Lovn type Nombre = String type Paterno = String type Materno = String type Edad = Int data Personas = Persona Nombre Paterno Materno Edad deriving Show Main> :t Persona Persona :: Nombre -> Paterno -> Materno -> Edad -> Personas Main> Persona "Martha" "Tapia" "Gallegos" 24 Persona "Martha" "Tapia" "Gallegos" 24 Lic. Wilber Ramos Lovn Haskell permite nombrar las distintas componentes de un tipo. Por ejemplo : type Nombre = String type Paterno = String type Materno = String type Edad = Int data Personas = Persona { nombre :: Nombre , paterno :: Paterno , materno :: Materno , edad :: Edad } deriving Show Lic. Wilber Ramos Lovn paola:: Personas paola= Persona { nombre = Paola" , paterno = Salas" , materno = Valencia" , edad = 17 } Main> paola Persona {nombre = "Paola", paterno = "Salas", materno = "Valencia", edad = 17} Lic. Wilber Ramos Lovn Adems se introducen automticamente las funciones selectoras para las componentes : Main> :t paola paola :: Personas Main> edad paola 17 Main> paterno paola "Salas" Lic. Wilber Ramos Lovn Se puede construir un nuevo valor a partir de otro existente Main> karla {paterno = "Carpio", materno = "Paredes" , edad = 28} Persona{nombre="Karla",paterno="Carpio",materno ="Paredes",edad=28} No afecta para nada el valor de karla como ocurrira en un lenguaje imperativo Main> karla Persona{nombre="Karla",paterno="Torres",materno ="Martinez",edad=25} Lic. Wilber Ramos Lovn Los identificadores de constructores binarios de datos tambin pueden ser simblicos : data Complejo = Float :- Float deriving Show origen :: Complejo origen = 0.0 :- 0.0 parteReal :: Complejo -> Float parteReal (x:-_) = x parteImaginaria :: Complejo -> Float parteImaginaria (_:-y) = y Lic. Wilber Ramos Lovn Main> :t (:-) (:-) :: Float -> Float -> Complejo Main> 2.5 :- 7.3 2.5 :- 7.3 Main> parteReal (4.3 :- 7.5) 4.3 Main> parteImaginaria (4.5:-7.9) 7.9 Lic. Wilber Ramos Lovn El constructor de tipos Figura tiene cuatro variantes. Cada constructor de datos tiene su aridad type Radio = Float type Lado = Float data Figura = Crculos Radio |Cuadrados Lado |Rectngulos Lado Lado |Puntos deriving Show Lic. Wilber Ramos Lovn crculo :: Figura crculo = Crculos 4.5 Main> crculo Crculos 4.5 listaFiguras :: [Figura] listaFiguras = [Crculos 7.5, Cuadrados 3.2, Rectngulos 4.1 5.6] Main> listaFiguras [Crculos 7.5,Cuadrados 3.2,Rectngulos 4.1 5.6] Lic. Wilber Ramos Lovn Observe los tipos de constructores introducidos Main> :t Crculos Crculos :: Radio -> Figura Main> :t Cuadrados Cuadrados :: Lado -> Figura Main> :t Rectngulos Rectngulos :: Lado -> Lado -> Figura Main> :t Puntos Puntos :: Figura Lic. Wilber Ramos Lovn Problemas 1. Defina dos funciones para calcular el rea y permetro de una figura. 2. Defina un nuevo tipo de dato que se llamar temperatura.Este tipo de dato representar las temperaturas en grados Fahrenheit, Centgrados, Kelvin. Para representar este tipo de dato recuerde que: 32 Fahrenheit = 0 Centgrados 273 Kelvin = 32 Centgrados Sobre este tipo de dato defina funciones que transformen grados Centgrados a Kelvin y Fahrenheit y viceversa. Lic. Wilber Ramos Lovn