Pattern Matching y Nuevos tipos Taller de Álgebra I Cuatrimestre de verano de 2015 Repaso Repaso de los ejercicios de tarea. minimo :: [Integer] -> Integer ordenada :: [Integer] -> Bool eliminarRepetidos :: [Integer] -> [Integer] Pattern Matching Pattern Matching El Pattern Matching consiste en especificar patrones para algún dato que luego de verificar el patrón será deconstruido en sus componentes para poder utilizarlas por separado. En Números fact :: Integer -> Integer -> Integer fact 0 = 1 fact n = n * fact ( n - 1) enIngles enIngles enIngles enIngles enIngles enIngles enIngles :: Integer -> [ Char ] 1 = " One ! " 2 = " Two ! " 3 = " Three ! " 4 = " Four ! " 5 = " Five ! " x = " Not sure : s " Pattern Matching: Tuplas Pattern Matching El Pattern Matching consiste en especificar patrones para algún dato que luego de verificar el patrón será deconstruido en sus componentes para poder utilizarlas por separado. En Tuplas sumarVectores :: ( Int , Int ) -> ( Int , Int ) -> ( Int , Int ) sumarVectores a b = ( fst a + fst b , snd a + snd b ) sumarVectores2 :: ( Int , Int ) -> ( Int , Int ) -> ( Int , Int ) sumarVectores2 ( x1 , y1 ) ( x2 , y2 ) = ( x1 + x2 , y1 + y2 ) iguales :: ( Int , Int ) -> Bool iguales (x , x ) = True -- Funciona ? iguales t = False Pattern Matching: Listas Pattern Matching El Pattern Matching consiste en especificar patrones para algún dato que luego de verificar el patrón será deconstruido en sus componentes para poder utilizarlas por separado. En Listas head :: [ a ] -> a head ( x : xs ) = x tail :: [ a ] -> [ a ] tail ( _ : xs ) = xs take take take 0 _ _ [] n ( x : xs ) = = = [] [] x : take (n -1) xs Pattern Matching: Ejercicios Completar las siguientes funciones first :: (a , b , c ) -> a first (x , y , z ) = longitud longitud longitud longitud longitud longitud :: [ a ] -> Integer [] = ( x :[]) = ( x : y :[]) = ( x : y : z :[]) = ( _ : _ : _ : xs ) = iniciales :: [ Char ] -> [ Char ] -> [ Char ] iniciales nombre apellido = where ( n : _ ) = nombre ( a : _ ) = apellido Nuevos Tipos: type Definamos un nuevo tipo type Conj = [ Integer ] [1 ,2 ,3 ,4] :: Conj ¿Para qué sirve type? type Matriz = ( Integer , Integer , Integer , Integer ) type Punto = ( Integer , Integer ) dist :: Punto -> Punto -> Float Implementar las siguientes funciones vacio :: Conj conjuntizar :: [Integer] -> Conj union :: Conj -> Conj -> Conj interseccion :: Conj -> Conj -> Conj Nuevos Tipos: Enumerados Cómo están definidos los Booleanos data Bool = False | True El término data significa que estamos definiendo un nuevo tipo de datos. La parte antes del igual denota el tipo Luego del igual están los construtores. Los constructores especifican los diferentes valores que puede poseer el tipo (La barra vertical denota las distintas opciones de contrucción de valores del tipo). Nuevo tipo: Tipo Dia data Dia = Lunes | Martes | ... | Sabado | Domingo Definir las siguientes funciones esFinde :: Dia -> Bool que determina si el dı́a es o no parte del fin de semana. diaHabil :: Dia -> Bool que determina si el dı́a es un dı́a hábil. soloMaVi :: [Dia] -> [Dia] que deja en la lista original solo los martes y viernes. Ejercicios implementar la función tuplas que dada una [a] y una [b] calcule la lista resultante de unir los a con los b para generar una [(a,b)]. Si las listas son de distinta longitud se deben usar tantos elementos como se pueda. Nota: en Haskell dicha función es zip. Ej: tuplas [1,2,3,4] [’a’,’b’,’c’] [(1,’a’),(2,’b’),(3,’c’)] implementar la función invertir que dada una [(a,b)] calcule la lista [(b,a)] resultante de invertir el orden de las componentes de las tuplas. implementar la función diferencia que devuelve la diferencia entre dos conjuntos. implementar la función difsim que devuelve la diferencia simétrica entre dos conjuntos. (*) implementar la función incluido :: Conj -> Conj -> Bool que indique si el primero está incluido en el segundo. (*) implementar la función equivalentes :: Conj -> Conj -> Bool que indique si dos conjuntos son iguales o no. implementar la función separar :: Integer -> Conj -> (Conj,Conj) para que la expresión separar x c retorne el par (c1,c2) tal que c1 ∪ c2 = c y ∀e ∈ c1 · e ≤ x y ∀e ∈ c2 · e > x Sumatorias Ejercicio Calcular las sumas parciales de una lista: sumParc :: [ Integer ] -> [ Integer ] ejemplo sumParc [1,2,3,4] [1,3,6,10] Y ahora... Implementar y resolver el item anterior usando: sumParcAux :: Integer -> [ Integer ] -> [ Integer ] tal que sumParcAux z [a,b,c] [z+a,z+a+b,z+a+b+c] Fibonacci Más Ejercicios, definir las siguientes funciones: 1 fib :: Integer -> Integer tal que fib n calcule el n-ésimo número de la serie de fibonacci usando la formulación clásica. 2 serieFib :: Integer -> [ Integer ] tal que serieFib n genere toda la serie de fibonacci hasta en n-ésimo número sin repetir cálculos. Es importante aprovechar los calculos hechos en serieFib (n-1) para serieFib n. 3 fibRapido :: Integer -> Integer tal que fibRapido n calcule el n-ésimo número de la serie de fibonacci usando la función serieFib. Evaluar la diferencia de velocidades entre fib y fibRapido Listas Definir las siguientes funciones: 1 prefijos :: [ a ] -> [[ a ]] que calcule todos los prefijos no vacios de una lista. Ej: prefijos [1,2,3] [[1],[1,2],[1,2,3]] 2 sufijos :: [ a ] -> [[ a ]] que calcule todos los sufijos no vacios de una lista. Ej: prefijos [1,2,3] [[1,2,3],[2,3],[3] 3 sublistas :: [ a ] -> [[ a ]] que calcule todas las sublistas no vacı́as de una lista. Dada una lista [l0 , l1 . . . ln−1 ], sus sublistas son las listas [li , li+1 , . . . li+k ] ∀i, k ∈ Z | 0 ≤ i ≤ i + k < n. Logo data Direccion = Norte | Sur | Este | Oeste deriving Show type Tortuga = ( Pos , Direccion ) type Pos = ( Int , Int ) Ejercicios 1 arranca :: Tortuga que devuelva una tortuga en el (0,0) mirando hacia el Norte 2 girarDerecha :: Tortuga -> Tortuga que gire la tortuga 90 grados a la derecha sin moverla de lugar. 3 girarIzquierda :: Tortuga -> Tortuga que gire la tortuga 90 grados a la izquierda sin moverla de lugar. 4 avanzar :: Tortuga -> Int -> Tortuga hace avanzar hacia el lugar donde mira la tortuga la distancia indicada.