Tema 3: Tipos en Haskell
A. Ch´avez Gonz´alez y C. Graciani D´ıaz
Departamento de Ciencias de la Computaci´on e Inteligencia Artificial
´Indice
Introducci´on
Tipos simples predefinidos
Tipos Compuestos
Introducci´
on
Definici´on de funci´on. Elementos: Declaraci´on de tipo, m´etodo de c´omputo, par´ametro formal de la funci´on Haskell es un lenguaje fuertemente tipificado. Un tipo es una colecci´on de valores que tienen algo en com´un, est´an relacionados.
Haskell es un lenguaje de tipo seguro: La inferencia de tipos precede a la evaluaci´on
El tipo seguro evita errores de tipo en la evaluaci´on, pero hay otra clase de errores que no evita
Introducci´
on
El conjunto de valores, funciones y operadores predefinidos es ampliable, incluso se pueden definir nuevos tipos de datos Ejemplo: Una funci´on de dos argumentos: Observar el tipo de la funci´on, el tipo de los argumentos, la inferencia de tipos . sumaCuadrados :: Integer → Integer → Integer
sumaCuadrados x y = x ∗ x + y ∗ y Main > sumaCuadrados (2 + 2) 3 25 :: Integer
´Indice
Introducci´on
Tipos simples predefinidos
Tipos Compuestos
El tipo Bool
Expresiones l´ogicas cuyo resultado puede ser verdadero o falso. Constructores:
True, False
Funciones y operadores:
(&&) :: Bool -> Bool -> Bool (||) :: Bool -> Bool -> Bool not :: Bool -> Bool
El tipo Int
N´umeros enteros de precisi´on limitada en el intervalo −229, 229− 1
Funciones y operadores:
(+)(-)(*) :: Int -> Int -> Int (↑) :: Int -> Int -> Int
div, mod :: Int -> Int -> Int abs :: Int -> Int
signum :: Int -> Int negate :: Int -> Int even, odd :: Int -> Bool
Ejemplo: Podemos definir otras funciones a partir de ellas
maximo :: Int -> Int -> Int
El tipo Integer
Los valores son enteros de precisi´on arbitraria que se usan cuando los n´umeros tratados se salen del rango de los valores del tipo Int
El c´alculo es menos eficiente
Las operaciones disponibles son las mismas que para el tipo de datos Int
El tipo Float
N´umeros reales. Disponen de una cantidad fija de memoria. Notaci´on:
1.35, -15.345, 1.0 ´o 1 1.5e7, 1.5e - 17 Funciones y operadores:
(+)(−)(∗)(/) :: Float -> Float -> Float (↑) :: Float -> Int -> Float
(∗∗) :: Float -> Float -> Float abs :: Float -> Float
signum :: Float -> Float (-1.0, 0.0, 1.0) negate :: Float -> Float
El tipo Float
Funciones y operadores:
atan2 :: Float -> Float -> Float log, exp :: Float -> Float
sqrt :: Float -> Float pi :: Float
trucate, round, floor, ceiling :: Float -> Float fromInt :: Int -> Float
El tipo Double
N´umeros reales en un intervalo mayor que Float M´as precisi´on (doble)
El tipo Char
Un valor tipo Char representa un car´acter (a’, ’1’, ’ ?’) Caracteres especiales van precedidos por
\ ’\n’ Salto de l´ınea ’\t’ Tabulador ’\’’ Comilla ’\’’’ Comilla doble ’\’ El car´acter \ Funciones:
ord :: Char -> Int chr :: Int -> Char
isUpper, isLower, isDigit, isAlfa :: Char -> Bool toUpper, toLower :: Char -> Char
El tipo Char
Ejemplos:
Prelude> toUpper ’a’ ’A’ :: Char
Prelude> isUpper ’a’ False :: Bool
Prelude> ord ’a’ 97 :: Int
Prelude> chr 98 ’b’ :: Char
Operadores de igualdad y orden
Para todos los tipos b´asicos est´an definidos los operadores binarios que devuelven un valor booleano:
(<) mayor que (>=) mayor o igual que (<) menor que (<=) menor o igual que (==) igual que (/=) distinto de
Operadores de igualdad y orden
El tipo de los dos argumentos debe ser el mismo
Prelude> 10 ≤ 15 Prelude> ’b’ > ’a’ True :: Bool True :: Bool
Prelude> ’x’ == ’y’ Prelude> False < True False :: Bool True :: Bool
Prelude> ’x’ 6= ’y’ Prelude> (1 < 5) && (10 > 9) True :: Bool True :: Bool
Prelude> True < ’a’
ERROR : Type error in application *** Expression : True < ’a’
*** Term : True *** Type : Bool
Operadores de igualdad y orden
Orden para el tipo Char: may´usculas son menores que min´usculas. Dentro de cada grupo se mantiene el orden alfab´etico.
Orden para el tipo Bool: False menor que True
(==) es el s´ımbolo de igualdad, = se reserva para definir funciones
Para todos los tipos que definen un orden, est´an definidas las funciones max y min
´Indice
Introducci´on
Tipos simples predefinidos
Tipos Compuestos
Adem´as de los tipos simples, Haskell define tipos estructurados que permiten representar colecciones de objetos.
Tuplas
Una tupla es un dato compuesto donde cada componente puede ser de un tipo diferente
Si v1, v2, . . . , vn son valores con tipo t1, t2, . . . , tn, entonces
(v1, v2, . . . , vn)es una tupla con tipo (t1, t2, . . . , tn)
Ejemplos:
Prelude> (’a’, True, 1.5)
(’a’, True, 1.5) :: (Char, Bool, Double) ´
Utiles cuando una funci´on tiene que devolver m´as de un valor predSuc :: Integer -> (Integer -> Integer)
Listas
Una lista es una colecci´on de cero o m´as elementos todos del mismo tipo. Hay dos constructores u operadores para construir valores para listas:
[] Lista vac´ıa
(:) A˜nade un elemento al princicipo de una lista. Si v1, v2, . . . , vn son valores con tipo t, entonces
v1: (v2 : (. . . (vn−1 : (vn: [])) . . . )) es una lista con tipo [t]
Ejemplos:
1 : [] Lista que almacena un ´unico entero; tipo [Integer ] 3 : (1 : []) Lista que almacena dos enteros; primero el 3 y luego el 1; tipo [Integer ]
Listas
Una lista es una colecci´on de cero o m´as elementos todos del mismo tipo. Hay dos constructores u operadores para construir valores para listas:
[] Lista vac´ıa
(:) A˜nade un elemento al princicipo de una lista. Si v1, v2, . . . , vn son valores con tipo t, entonces
v1: (v2 : (. . . (vn−1 : (vn: [])) . . . )) es una lista con tipo [t]
Ejemplos:
1 : [] Lista que almacena un ´unico entero; tipo [Integer ] 3 : (1 : []) Lista que almacena dos enteros; primero el 3 y luego el 1; tipo [Integer ]
Listas
Asociatividad a la derecha del operador (:). La lista x1: x2 : · · · : xn−1: xn: [] representar´a
x1: (x2 : (· · · : (xn−1: (xn : [])) . . . ))
Haskell permite una sintaxis m´as c´omoda [x1, x2, . . . , xn−1, xn]
Ejemplos: Prelude> 1:(2:(3:[])) [1,2,3] :: [Integer] Prelude> 1:2:3:[] [1,2,3] :: [Integer] Prelude> [1,2,3] [1,2,3] :: [Integer]
Listas
Asociatividad a la derecha del operador (:). La lista x1: x2 : · · · : xn−1: xn: [] representar´a
x1: (x2 : (· · · : (xn−1: (xn : [])) . . . ))
Haskell permite una sintaxis m´as c´omoda [x1, x2, . . . , xn−1, xn]
Ejemplos: Prelude> 1:(2:(3:[])) [1,2,3] :: [Integer] Prelude> 1:2:3:[] [1,2,3] :: [Integer] Prelude> [1,2,3] [1,2,3] :: [Integer]
Cadenas de caracteres
Una cadena de caracteres es una secuencia de cero o m´as caracteres.
Lista de caracteres 00x1x2. . . xn−1xn00 representa
[0x10,0x20, . . . ,0xn−10 ,0xn0] Ejemplos:
Prelude> [’U’, ’n’, ’ ’, ’C’,’o’, ’c’, ’h’, ’e’] ‘‘Un Coche’’ :: [Char]
Prelude> ‘‘Un Coche’’ ‘‘Un Coche’’ :: String
Prelude> ’U’: ’n’: ’ ’: ’C’:’o’: ’c’: ’h’: ’e’:[] ‘‘Un Coche’’ :: [Char]
Cadenas de caracteres
Una cadena de caracteres es una secuencia de cero o m´as caracteres.
Lista de caracteres 00x1x2. . . xn−1xn00 representa
[0x10,0x20, . . . ,0xn−10 ,0xn0] Ejemplos:
Prelude> [’U’, ’n’, ’ ’, ’C’,’o’, ’c’, ’h’, ’e’] ‘‘Un Coche’’ :: [Char]
Prelude> ‘‘Un Coche’’ ‘‘Un Coche’’ :: String
Prelude> ’U’: ’n’: ’ ’: ’C’:’o’: ’c’: ’h’: ’e’:[] ‘‘Un Coche’’ :: [Char]
El constructor de tipo (→)
Para declarar el tipo correspondiente a las funciones. Si t1, t2, . . . , tn, tr son tipos v´alidos, entonces
t1 → t2→ · · · → tn→ tr es el tipo de una funci´on con n
argumentos Ejemplo:
inc :: Integer -> Integer inc x = x + 1
Funciones que devuelven otra funci´on (funciones de orden
superior):
componer :: (Int -> Int) -> (Int -> Int) -> Int -> Int componer f g x = g (f x)
El constructor de tipo (→)
Para declarar el tipo correspondiente a las funciones. Si t1, t2, . . . , tn, tr son tipos v´alidos, entonces
t1 → t2→ · · · → tn→ tr es el tipo de una funci´on con n
argumentos Ejemplo:
inc :: Integer -> Integer inc x = x + 1
Funciones que devuelven otra funci´on (funciones de orden superior):
componer :: (Int -> Int) -> (Int -> Int) -> Int -> Int componer f g x = g (f x)
El constructor de tipo (→)
Para declarar el tipo correspondiente a las funciones. Si t1, t2, . . . , tn, tr son tipos v´alidos, entonces
t1 → t2→ · · · → tn→ tr es el tipo de una funci´on con n
argumentos Ejemplo:
inc :: Integer -> Integer inc x = x + 1
Funciones que devuelven otra funci´on (funciones de orden superior):
componer :: (Int -> Int) -> (Int -> Int) -> Int -> Int componer f g x = g (f x)
´Indice
Introducci´on
Tipos simples predefinidos
Tipos Compuestos
Parcializaci´
on
Las funciones con m´as de un argumento pueden interpretarse como funciones que toman un argumento y devuelven otra funci´on con un argumento menos.
suma :: Int -> Int -> Int suma x y = x+y
suma toma un entero x y devuelve la funci´on suma x que toma un entero y y devuelve la suma de x e y.
Main> :type suma 2 suma 2 :: Int -> Int Main> :type suma 2 3 suma 2 3 :: Int
Aplicaci´
on parcial
Las funciones que toman sus argumentos de uno en uno se llaman currificadas (curried).
Las funciones currificadas pueden aplicarse parcialmente. Pueden definirse funciones usando aplicaciones parciales. suc x es el sucesor de x
suc :: Int -> Int suc = suma 1 Main> suc 2 3