Tipos Tipo: conjunto de valores asociados a operaciones. Ejemplos: enteros, caracteres, booleanos, funciones de enteros a enteros. Sirven para: detectar errores antes de la evaluación especificar programas (de forma rudimentaria) ayudar al programador a diseñar el programa (abstracción) optimizar código durante la compilación Es una buena práctica de programación escribir el tipo del programa antes de escribir el mismo.
En Haskell, todo valor tiene asociado un tipo. Es un lenguaje fuertemente tipado. Acepta solamente expresiones que tengan tipo. Tiene inferencia de tipo. Utiliza el algoritmo de inferencia de tipos de Hindley Milner, que asignada a una expresión el tipo más general. El chequeo de tipos es estático, es decir, los tipos son chequeados en tiempo de compilación.
Ya vimos: Tipos primitivos: Int, Char, Bool, Float Tuplas: (Int,Char) Tipo de las listas: [Int] Tipo de las funciones: Int Int Tipos polimórficos: a a Enumeraciones, con el constructor data. data Respuesta = Si No Nose donde Respuesta es un nuevo tipo con valores Si, No y Nose.
Declaraciones data Pueden tener parámetros de tipo: data Maybe a = Nothing Just a headt :: [a] Maybe a headt [] = Nothing headt (x:_) = x Pueden ser recursivas: data Nat = Zero Suc Nat suma :: Nat Nat Nat suma Zero n = n suma (Suc n) m = Suc (suma n m)
Declaraciones data Zero, Suc, Nothing y Just se denominan constructores. Los nombres de los constructores deben comenzar con letra mayúscula. Los constructores son funciones: Zero :: Nat Suc :: Nat Nat Nothing :: Maybe a Just :: a Maybe a Ejercicio: Definir un tipo para listas con elementos de cualquier tipo utilizando data.
Currificación Qué diferencias hay entre las siguientes funciones? minimo :: (Int, Int) Int minimo (x,y) = if x y then x else y minimoc :: Int Int Int minimoc x y = if x y then x else y La función minimoc toma un entero y devuelve una función que dado un entero devuelve un entero. Diremos que esta función está currificada.
Currificación Ventajas: Se reduce el número de paréntesis en una expresión. Las funciones currificadas pueden ser aplicadas a un sólo argumento, obteniendose así otra función que puede ser útil. Ejemplos: mintres :: Int Int mintres x = minimo 3 x sumacinco :: Nat Nat sumacinco x = suma 5 x
Aplicación de funciones Para que la currificación tenga sentido necesitamos que la aplicación de función asocie a izquierda. minimo 3 x es lo mismo que (minimo 3) x suma 5 x es lo mismo que (suma 5) x Por lo tanto debe asociar a derecha. Int Int Int es igual a Int (Int Int)
Funciones de alto orden Decimos que una función es de alto orden si: Toma como parámetro una función. Ejemplos: map :: (a b) [a] [b] filter :: (a Bool) [a] [a] Cuáles son los tipos de las funciones que toman como parámetro? Devuelve como resultado una función. Ejemplos: suma :: Nat Nat Nat minimoc :: Int Int Int Cuáles son los tipos de las funciones que devuelven?
La función filter Captura un esquema de recursión. filter :: (a Bool) [a] [a] filer p [] = [] filter p (x:xs) p x = x : filter p xs otherwise = filter p xs
La función filter positivos :: [Int] [Int] positivos [] = [] positivos (x:xs) x 0 = x : positivos xs otherwise = positivos xs pares :: [Int] [Int] pares [] = [] pares (x:xs) even x = x : pares xs otherwise = pares xs
En términos de filter positivos :: [Int] [Int] positivos xs = filter ( 0) xs pares :: [Int] [Int] pares xs = filter even xs
La función map Aplica una función dada a todos los elementos de una lista dada. map :: (a b) [a] [b] map f [] = [] map f (x:xs) = f x : map f xs Ejemplos: sumauno :: [Int] [Int] sumauno = map (+1) toint :: [Char] [Int] toint = map ord