Prueba Funcional Curso 2015 Ejercicio 1 Sean las siguientes definiciones: data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Eq,Show,Read) subTree subTree subTree subTree subTree :: (Eq a) => Tree a -> Tree a -> Bool Nil Nil = True Nil (Node a t1 t2) = False _ Nil = False (Node a t1 t2) (Node b g1 g2) | a == b = (subTree t1 g1) && (subTree t2 g2) | otherwise = (subTree t1 (Node b g1 g2)) || (subTree t2 (Node b g1 g2)) ¿Cuál de las siguientes expresiones devuelve True al ser evaluada? a) subTree (Node 5 (Node 1 (Node 4 Nil Nil) Nil) (Node 2 (Node 3 Nil Nil) Nil)) (Node 1 (Node 4 Nil Nil) Nil) b) subTree (Node 1 (Node 4 Nil Nil) Nil) (Node 1 (Node 3 Nil Nil) Nil) c) subTree (Node 1 (Node 4 Nil Nil) Nil) (Node 5 (Node 1 (Node 4 Nil Nil) Nil) (Node 2 (Node 3 Nil Nil) Nil)) d) subTree (Node 1 (Node 4 Nil Nil) Nil) (Node 1 Nil Nil) Ejercicio 2 Sea la siguiente definición: puf :: Ord a => [a] -> Bool puf = and . comb (zipWith (<=)) tail where comb f g x = f x (g x) La función puf retorna el valor True cuando se aplica a una lista que cumple : a) Algún elemento de la lista es menor o igual que todos los siguientes. b) Algún elemento de la lista es menor o igual que el elemento que le sigue. c) La lista está ordenada de forma mónotona decreciente. d) La lista está ordenada de forma mónotona creciente. Ejercicio 3 Sean las funciones f y g con tipos: f :: (a -> b -> c) -> b -> a -> c g :: a -> [a] Indicar cual de las siguienes expresiones tiene tipo (a -> b -> c) -> [b -> a -> c] (faltó en la 1 letra impresa) a) g f b) f g c) f . g d) g . f Ejercicio 4 ¿Cual de las siguientes expresiones está bien tipada? a) uncurry (foldr (:)) b) uncurry . (foldr (:)) c) foldr (uncurry (:)) d) foldr (:) . uncurry Ejercicio 5 Sean las siguientes definiciones: scanl' :: (a -> b -> b) -> b -> [a] -> [b] scanl' f st xs = ys where ys = st : zipWith f xs ys Indique cuál de las siguientes afirmaciones es correcta: a) (scanl' (*) 1 [1..]) es una lista finita b) la evaluación de take 5 (scanl' (*) 1 [1..]) da como resultado [1,1,2,6,12] c) takeWhile (> 0) (scanl' (*) 1 [1..]) es una lista infinita d) (scanl' (*) 1 [1..]) es la lista [1,1 ..] Ejercicio 6 Sea la siguiente definición: dd :: Eq a => [a] -> [a] dd [] = [] dd (x:y:xs) | x == y = xs | otherwise = x : y : dd xs Indicar cual es el resultado de evaluar (dd "xaaybbcd") a) "xaaycd" b) "xycd" c) "xaaybbcd" d) "xybbcd" 2 Ejercicio 7 Se considera la definición de clase: class (Eq a, Show a) => Num a where (+), (-), (*) :: a -> a -> a negate, abs, signum :: a -> a fromInteger :: Integer -> a x - y = x + negate y Indique cuál de las siguientes afirmaciones es correcta: a) Toda instancia de Num debe definir la operación (-) b) Toda instancia de Num debe definir la operación negate c) Ninguna instancia de Num debe definir la operación (-) d) La definición de negate es opcional. Ejercicio 8 Sean las siguientes definiciones: maybeX (Just n) xs = Just (xs !! n) maybeX Nothing xs = Nothing pos :: (Eq a) => a -> [a] -> Maybe Int pos a xs | ys /= [] = Just (head ys) | otherwise = Nothing where ys = [i | (i,j) <- zip [0 .. (length xs)] xs , j == a] diagonal (ys:yss) = [ maybeX ? xs | xs <- ys:yss] matriz = [[1,2,3,4], [0,0,0,0], [5,6,7,8], [1,1,1,1]] ¿Qué expresión debe ir en ? para que el resultado de evaluar la expresión diagonal matriz sea ([Just 1, Just 0, Just 7, Just 1])? a) (pos (ys:yss) xs) b) (pos [1,2,3,4] (ys:yss)) c) (pos xs (ys:yss)) d) (yss !! pos ys yss) Ejercicio 9 Indicar cuál es el tipo más general de la expresión: \ f g x -> f (f x) (g x) a) ((b -> b) -> b -> b) -> ((b -> b) -> b) -> (b -> b) -> b b) ((a -> b) -> a -> b) -> ((a -> b) -> a) -> (a -> b) -> b c) ((a -> b) -> a -> b) -> ((b -> b) -> a) -> (a -> b) -> b d) ((a -> b) -> b -> b) -> ((b -> b) -> a) -> (a -> b) -> a 3 Ejercicio 10 Sea la definición: f :: [Int] -> [Int] -> Int -> [Int] f xs ys = \m -> case m `mod` 2 of 1 -> g [m] xs 0 -> g [m] ys where g = foldr (:) La evaluación de f [1,3,5] [0,2] 4 da como resultado: a) [0,2,4] b) [4,2,0] c) [0,4,2] d) [4,1,3,5] Ejercicio 11 Sea la definición: h = (filter (> "a") . map (\s -> (:[])s)) ¿Cual de las siguientes expresiones al ser evaluada da la lista vacía? a) h "oso" b) h "hola" c) h "aaa" d) h "ala" Ejercicio 12 Sean las siguientes definiciones heads :: [[a]] ­> [a] heads = map head tails :: [[a]] ­> [[a]] tails = map tail xs :: [[Int]] xs = [[1,2,3],[1]] Considere las expresiones: 1) length (heads (tails xs)) 2) length $ head $ tails $ tail xs 3) length (tail (heads (tails xs))) Indique cuál de las siguientes afirmaciones es verdadera: a) La expresión 1) produce un error cuando es evaluada b) La expresión 2) produce un error cuando es evaluada c) La expresion 3) produce un error cuando es evaluada d) Ninguna de las 3 expresiones produce un error al ser evaluada. 4