ANÁLISIS DE LENGUAJES DE PROGRAMACIÓN I PRÁCTICA DE LABORATORIO 3: Los naturales como tipo inductivo - Listas Eric Biagioli Pablo Speciale Se usará la siguiente definición de los Naturales data Nat = Zero | Succ Nat deriving(Eq, Show) 1. Defina las siguientes funciones para los Naturales: a. suma :: Nat -> Nat -> Nat, que suma dos naturales. b. prod :: Nat -> Nat -> Nat, que multiplica dos naturales. c. power :: Nat -> Nat -> Nat, que sea la exponenciación entre dos naturales. d. fact :: Nat -> Nat, que represente el factorial para naturales. e. fib :: Nat -> Nat, que represente la función Fibonacci para naturales. Los números de Fibonacci f0 , f1 , . . . se definen mediante la regla f0 = 0, f1 = 1 y fn+2 = fn + fn+1 para todo n ≥ 0. Para las funciones suma, prod y power, aplicar pattern matching sobre el segundo argumento. 2. Funciones de conversión: a. nat2int :: Nat -> Int, que convierta un Nat a Int. b. int2nat :: Int -> Nat, que convierta un Int a Nat. 3. Definir versiones de suma y prod que impongan pattern matching sobre el primer argumento. ¿Se puede hacer lo mismo para power? 4. Funciones de órden: a. leq :: Nat -> Nat -> Bool, que represente la función (<=) para Nat. b. geq :: Nat -> Nat -> Bool, que represente la función (>=) para Nat. c. gt :: Nat -> Nat -> Bool, que represente la función (>) para Nat. d. lt :: Nat -> Nat -> Bool, que represente la función (<) para Nat. Para las últimas tres funciones, no usar pattern matching ni guardas; definirlas en término de las anteriores. Observación: se podrı́an haber generado automáticamente funciones similares a éstas, si se hubiese agregado Ord dentro de deriving, en la definición del tipo Nat. 5. Definir las siguientes funciones, a. null :: [a] -> Bool, que comprueba si una lista es vacı́a. b. length :: [a] -> Integer, que retorna la longitud de una lista. 1 ANÁLISIS DE LENGUAJES DE PROGRAMACIÓN I c. append :: [a] -> [a] -> [a], que concatena dos listas (conocido como (++)). d. concat :: [[a]] -> [a], que concatena una lista de listas en una sola lista. e. reverse :: [a] -> [a], que invierta el orden de los elementos de la lista. f. head :: [a] -> a, que retorna el primer elemento de una lista no vacı́a. Dejar sin definir en el caso de la lista vacı́a. g. tail :: [a] -> [a], que retorna todos los elementos de una lista no vacı́a, menos el primero. Dejar sin definir en el caso de la lista vacı́a. h. last :: [a] -> a, que retorna el último elemento de una lista no vacı́a. i. init :: [a] -> [a], que retorna todos los elementos de una lista no vacı́a, menos el último elemento. Tener en cuenta que posiblemente los nombres ya existan, ası́ que añadirle al nombre una comilla (’). 6. Definir la función prodL :: [Int] -> Int que retorna el producto de los elementos de una lista de enteros. 7. Definir la función minL :: [Int] -> Int que devuelve el menor elemento de una lista no vacı́a de enteros. 8. Definir and :: [Bool] -> Bool, que toma una lista de booleanos y devuelve True si todos sus elementos son True; en otro caso, devuelve False. 9. Dar una posible definición para la función mapL, sabiendo que se comporta de la siguiente manera: mapL f [x0 , x1 , ..., xn ] == [f x0 , f x1 , ..., f xn ] 10. Usando la función map, equivalente a mapL, pero que ya está definida en el preludio de Haskell, dar una definición para las siguientes funciones: (a) duplicarTodos: duplica el valor de todos los elementos de una lista de enteros. (b) longitudes: dada una lista de listas, devuelve una lista con sus respectivas longitudes. (c) aMayusculas: convierte una cadena a maysculas. (d) duplicarListas: dada una lista de listas de enteros, duplica el valor de todos los enteros. 11. Definir la función filterL :: (a->Bool)->[a]->[a] que toma un predicado, una lista y devuelve la sublista de aquellos elementos que verifican el predicado. 12. Usando la función filter, equivalente a filterL, pero que ya está definida en el preludio de Haskell, dar una definición para las siguientes funciones: (a) Definir digitos: dada una cadena de entrada devuelve los dı́gitos contenidos en la misma. 2 ANÁLISIS DE LENGUAJES DE PROGRAMACIÓN I (b) Definir apariciones: dados un entero y una lista, devuelve las apariciones de ese entero en la lista. Por ejemplo, Hugs> apariciones 2 [1,2,4,2,2,5] [2,2,2] (c) Definir filtrarCortas: dada una lista de listas, devuelve todas las listas de longitud mayor a un entero positivo dado. (d) Definir ordenadas: dada una lista de listas de enteros, devuelve solo las que están en orden creciente. 3