PRÁCTICA DE LABORATORIO 2: Tipos.

Anuncio
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
Descargar