Académique Documents
Professionnel Documents
Culture Documents
28 de Agosto de 2012
M
as problemas con listas
Ejercicio 1
Sea el siguiente tipo: type Punto = (Int,Int)
Definir, usando listas por comprensi
on, una lista (infinita)
puntosDelPlano::[Punto] que contenga todos los puntos del
cuadrante superior derecho del plano.
Atenci
on: la funci
on debe garantizar que eventualmente todo punto del
cuadrante superior derecho ser
a listado. Una forma de garantizar esto es
recorrer los puntos siguiendo las diagonales x + y = k, con k = 0, 1, 2, 3, . . .
M
as problemas con listas
Soluciones
Soluci
on 1
puntosDelPlano :: [Punto]
puntosDelPlano = [(x, y) | k <-[0..], x <-[0..k], y <-[0..k],
x + y == k]
Soluci
on 2
puntosDelPlano :: [Punto]
puntosDelPlano = [(x,k-x) | k<-[0..], x<-[0..k]]
M
as problemas con listas
Ejercicio 2
M
as problemas con listas
Ejercicio 3
Definir en Haskell una lista que contenga todas las listas finitas de
enteros positivos (esto es, con elementos mayores o iguales que 1).
No debe haber listas repetidas.
Soluci
on
listasPositivas::[[Int]]
listasPositivas = [xs | n<-[0..], xs<-listasQueSuman n]
M
as problemas con listas
M
as problemas con listas
Recordemos...
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr f z [] = z
foldr f z (x:xs) = x f (foldr f z xs)
foldr op z (a1 : (a2 : (a3 : []))) =
a1 op (a2 op (a3 op z ))
M
as problemas con listas
M
as problemas con listas
Ejercicio 4
M
as problemas con listas
Como hacemos?
Un esquema de recursi
on estructural espera recibir un argumento
por cada constructor (para saber que devolver en cada caso), y
ademas la estructura que va a recorrer.
El tipo de cada argumento va a depender de lo que reciba el
constructor correspondiente. (Y todos van a devolver lo mismo!)
M
as problemas con listas
M
as problemas con listas
Solucion
foldAB::(a->b)->(b->a->b->b)->AB a -> b
foldAB fHoja (Hoja n)
= fHoja n
foldAB fHoja fBin (Bin t1 n t2)
= fBin (foldAB fHoja fBin t1)
n (foldAB fHoja fBin t2)
M
as problemas con listas
Ejercicio 5
=
|
|
|
X
Cte a
Suma (Polinomio a) (Polinomio a)
Prod (Polinomio a) (Polinomio a)
M
as problemas con listas
Solucion
M
as problemas con listas
M
as problemas con listas
Tipo RoseTree
M
as problemas con listas
M
as problemas con listas
M
as problemas con listas
Ahora implementemoslo
foldRT::(a->[b]->b)->RoseTree a->b
foldRT f (Rose x hs) = f x (map (foldRT f) hs)
M
as problemas con listas
Y finalmente...
1
M
as problemas con listas
altura::RoseTree a->Int
altura = foldRT (\x rs->if (null rs) then 1 else 1+(maxlista rs))
where maxlista = foldr1 max
O, alternativamente...
altura = (+1).maxlista.distancias where maxlista = foldr1 max
(La lista de distancias nunca es vaca, as que podemos usar foldr1.)
M
as problemas con listas
M
as problemas con listas
M
as problemas con listas
M
as problemas con listas
? ?
? ?
? ? ? ? ? ? ?