Prueba Escrita. Programación Funcional. 2009 Nombre: CI: Pregunta 1 Dadas las siguientes definiciones: data Nat = Cero | Suc Nat instance Show Nat where show Cero = "0" show (Suc Cero) = "1" show (Suc n) = "1 + " ++ (show n) ++ "\n" suma :: Nat -> Nat-> Nat suma Cero n = n suma (Suc n) m = Suc (suma n m) ¿Cuál de las siguientes afirmaciones es correcta? a) b) c) d) el tipo de suma debe ser (Show Nat) => Nat -> Nat-> Nat las definiciones son correctas en la declaración del tipo falta ”deriving Show” el tipo de suma debe ser (Num Nat) => Nat -> Nat-> Nat Pregunta 2 Dadas las siguientes definiciones de la función que toma una lista y devuelve el último elemento: ult (x:xs) = if null xs then x else ult xs ult1 (x:xs) = if xs == [] then x else ult1 xs ¿Cuál de las siguientes afirmaciones es correcta? a) b) c) d) el tipo más general de ambas es [a] -> a ult1 está definida para la lista vacía y ult no Las funcionas no tienen el mismo tipo ult [Suc Cero] y ult1 [Suc Cero] evalúan ambas a Suc Cero (Suc Cero es elemento del tipo Nat de la pregunta 1) Pregunta 3 Sea la siguiente definición: f xss = \a -> let ope x y = x ++ [a] ++ y in foldr1 ope xss ¿Cuál es el resultado de evaluar f [[1,3],[2,4], [0,9,8]] 5 ? a) b) c) d) [[1,5,3], [2,5,4],[0,5,9,5,8]] [[1,3],[5],[2,4],[5], [0,9,8]] [1,3,5,2,4,5,0,9,8] [[1,3,5,2,4,5,0,9,8]] Pregunta 4 Sea la expresión serie = 1 : map (\x -> x * (x+1)) serie ¿Cuál de las siguientes afirmaciones es correcta? a) La definición anterior no compila correctamente b) la expresión (serie!!4) da como resultado 1806 c) La definición anterior es equivalente a serie = zipWith (*) [1 ..] [2..] d) el resultado de la evaluación de serie es una lista finita Pregunta 5 Sea la siguiente expresión: (!!) (scanl mod 1 [0..4]) 1 ¿Cuál de las siguientes afirmaciones es correcta? a) b) c) d) la la la la evaluación de la expresión produce un error evaluación de la expresión da como resultado 0 expresión no tiene tipo evaluación de la expresión da como resultado 1 Pregunta 6 Se considera la siguiente definición de árboles data Rose a = Fork a [Rose a] Se quiere definir la función member, que verifica si un elemento aparece en un árbol member :: Eq a => a -> Rose a -> Bool Indique cuál de las siguientes definiciones de member es correcta: a) b) c) d) member member member member a a a a (Fork (Fork (Fork (Fork r r r r ts) ts) ts) ts) = = = = if a == r then True else elem r ts a == r || map (==a) ts r == a || any (member a) ts if a==r then True else member a ts Pregunta 7 Dada la expresión zipWith . uncurry, ¿cuál de las siguientes afirmaciones es correcta? a) el tipo de la expresión es [a -> b -> c] -> [(a,b)] -> [c] b) el tipo de la expresión es (a -> b -> c -> d) -> [(a,b)] -> [c] -> [d] c) la expresión no tiene tipo d) el tipo de la expresión es (a -> b -> c) -> ([a],[b]) -> [c] Pregunta 8 Dada la expresión e = (foldr (++) . map (:)) [1,2,3] [[filter even]] Cuál de las siguientes afirmaciones es correcta: a) b) c) d) e no tiene tipo head e [5,6] es [6] el tipo de e es [[Integer]] -> [[Integer]] head e [] es [[]] Pregunta 9 Sea la definición posi a l | l1 /= [] = Just (head l1) | otherwise = Nothing where l1 = [i | (i,j) <- zip [0 .. (length l)] l , j == a] Indique el tipo más general de posi: a) b) c) d) Maybe Int -> [Int] -> Maybe Int (Eq a) => a -> [a] -> Maybe Int (Eq a) => a -> [a] -> Maybe a Maybe a -> [Maybe a] -> Maybe Int Pregunta 10 Se consideran las siguientes expresiones: a) b) c) d) e) (flip .) (. flip) (.) flip (.) $ flip flip $ (.) Indique cuál de las siguientes afirmaciones es correcta: a) b) c) d) Las expresiones Las expresiones La expresión d) Las expresiones b) c) no e) y c) tienen el mismo tipo y d) tienen el mismo tipo tiene tipo y a) tienen distinto tipo Pregunta 11 Sea la siguiente definición: cc xs ys = [ x | x <- xs, y <- ys, x <= y] Indicar cuál es el resultado de evaluar la expresión: let us = [1,1] in cc us us a) b) c) d) [] [1,1,1] [1,1,1,1] [1,1] Pregunta 12 Considere la siguiente definición: foo :: (Num a) => Int -> a -> a foo 0 = constante 1 foo (n+1) = combinar (*) (foo n) constante x _ = x combinar f g x = f x (g x) El resultado de la evaluación de (foo 4 2) es a) b) c) d) 16 4 2 8