ANÁLISIS DE LENGUAJES DE PROGRAMACIÓN I PRÁCTICA DE LABORATORIO 2: Tipos. Eric Biagioli Pablo Speciale 1. Definir en un script la variable a :: Int a = 1000000 y luego evaluar a ∗ a. ¿Es el resultado esperado? Repetir el ejercicio, pero declarando a :: Integer . 2. Explicar el efecto de la siguiente función mystery :: Int → Int → Int → Bool mystery m n p = not (m == n && n == p) 3. Definir una función three_different :: Int → Int → Int → Bool que devuelva True si y sólo si los tres enteros que se le pasan son distintos. . 4. En lógica, la implicación, denotada ⇒, se define como x ⇒ y = ¬x∨y. Definir una función implica :: Bool → Bool → Bool . 5. Definir las siguientes funciones utilizando guardas o la estructura if then else: a) lnot :: Bool → Bool : toma un booleano y devuelve su negación. b) land :: Bool → Bool → Bool : toma dos booleanos y devuelve la conjunción de los mismos (no usar el operador && predefinido en Haskell). c) lor ::Bool → Bool → Bool : toma dos booleanos y devuelve la disyunción de los mismos (no usar el operador || predefinido en Haskell). d) lequiv :: Bool → Bool → Bool : toma dos booleanos y devuelve la equivalencia de los mismos. e) lxor :: Bool → Bool → Bool : toma dos booleanos y devuelve el ó exclusivo de los mismos (no usar el operador /= predefinido en Haskell). 6. Repetir el ejercicio anterior utilizando pattern matching. 7. Definir una función avarage_three :: Int → Int → Int → Float que devuelva el promedio de tres enteros. 8. (Para pensar . . . ) Usando la función del ejercicio anterior, definir una función howManyAboveAvarage :: Int → Int → Int → Int que devuelva cuántos de los tres enteros que se le pasa están por encima del promedio. 9. Definir una función logartimo :: Float → Float → Float tal que logaritmo x b devuelva logb x. 1 ANÁLISIS DE LENGUAJES DE PROGRAMACIÓN I 10. Teniendo en cuenta que los valores de tipo Char están “ordenados” de la siguiente manera .........0 1 ...9 .........A B ...Z .........a b ...z ......... dar una definición de las siguientes funciones: a) is_Digit :: Char → Bool : toma un caracter y devuelve True si y sólo si el caracter representa un dígito. b) is_LowerCase ::Char → Bool : toma un caracter y devuelve True si y sólo si el caracter representa una letra minúscula. c) toUpperCase::Char → Char : si toma una letra minúscula, la transforma en mayúscula; en caso contrario, devuelve el mismo caracter. d) digitToNumber :: Char → Int : toma un caracter dígito y devuelve su correspondiente valor numérico. e) next_letter :: Char → Char : si toma un caracter que representa una letra (mayúscula o minúscula), devuelve la próxima letra en el abecedario (con la convención que la letra posterior a la ’z’ es la ’a’); en caso contrario, devuelve el mismo caracter. Sugerencia: utilizar las funciones ord y chr . Para poder usarlas, antes debe incluirse la sentencia import Data.Char al principio del script. 11. Dada la definición de tipo data Dia = Dom | Lun | Mar | Mie | Jue | Vie | Sab deriving (Eq, Ord , Enum, Show ) dar definiciones de las siguientes funciones: a) next_day :: Dia → Dia: devuelve el día posterior a un día dado. b) previous_day :: Dia → Dia: devuelve el día anterior a un día dado. c) dia_laborable :: Dia → Bool : devuelve True si y sólo si se le pasa un día laborable (lunes a viernes) d) fin_de_semana :: Dia → Bool : devuelve True si y sólo si se le pasa un día del fin de semana (sábado o domingo). Sugerencia: para las primeras dos funciones usar fromEnum y toEnum, y para las últimas dos, los operadores de comparación == y <=. 12. Definir un tipo de dato Direccion cuyos valores describan los puntos cardinales de la brújula (N, NE, E, SE, S, SO, O, NO), y definir una función invertir para invertir una dirección. 13. Dar la signatura de tipo y la definición de las siguientes funciones polimórficas: a) swap, que intercambia las componentes de un par. b) sndcte, que toma un par, y que devuelve otro par, cuya primera componente es la misma que la del par de entrada, y cuya segunda componete es el caracter ’f’. 2 ANÁLISIS DE LENGUAJES DE PROGRAMACIÓN I c) rep1stcomp, que toma una par y devuelve otro par cuyas dos componentes son la primer componente del par de entrada. 14. Dadas las siguientes definiciones: x :: Float x =5 y :: Int y =3 z :: Integer z =7 i. Indicar si las siguientes expresiones “tipan", y en caso afirmativo, dar su tipo. a) b) c) d) e) f) g) h) i) j) k) l) m) n) o) 3 ∗ 5 > 6 ∗ 10 if 5 > 7 then 8 else ’9’ y ∗y sqrt (cuadrado 2) donde cuadrado :: Integer → Integer x +y if x > y then 8 else 9 4∗x g ◦ ord donde g :: Int → Double h ◦ ord donde h :: Integer → Double [x ] [x , y ] (x , y) ([x ], [y ]) (x , x > 8) [2 == 3] ii. Dar el tipo de a) b) c) d) e) f) g) h) i) j) k) l) m) (>) en 5 > x (>) en 5 > y snd en snd (x , ’f’) fst en fst (y, x ) (∗) en z ∗ 2 (−) en 8 − y − en cuadrado (−z ) (◦) en cuadrado ◦ mi _f donde mi _f :: Bool → Integer j en x + fst (j , ’a’) f en y + snd (u, f y) f y g en (f x == y) &&(f x == g z ) f y g en f z && g x k en if 8 > z ∗ z then y else k 3 ANÁLISIS DE LENGUAJES DE PROGRAMACIÓN I 15. Dar la signatura de tipo de las funciones definidas por las siguientes ecuaciones: a) f x = 3 + cuadrado x b) g (a, b) = a + cuadrado b c) h a b = a + ord b d) j x = (x + a, x > 1.5) donde a :: Float e) k (x , y) = x f) l (x , y) = y + b donde b :: Double 4