Buenas,
Haciendo la prueba de 2017 me surgieron algunas dudas con respecto a los ejercicios 4, 7 y 10.
4. Dada la siguiente definición: foo f a = map (f a) ¿Cuál de las siguientes afirmaciones no es correcta? (a) El tipo es foo :: (a → b → c) → a → [b ] → [c ] (b) foo (||) False ≡ id (c) sum ◦ foo const 1 ≡ length (d) foo ($) ≡ map
No me queda claro por qué la b) no es correcta (es porque los tipos no coinciden?). Tampoco me queda claro por qué la d) sí lo es.
7. Dado el siguiente fragmento: mon x = monaux x >> print x ¿Cual de las siguientes afirmaciones es correcta? (a) Si monaux tiene tipo monaux :: Monad m ⇒ a → m () el tipo de mon es mon :: (Show a, Monad m) ⇒ a → m () (b) No importa cual sea la definicion de monaux , si su tipo es correcto la aplicacion (mon 9) siempre termina imprimiendo 9 (c) Si monaux tiene tipo monaux :: Monad m ⇒ Int → m Int el codigo de mon no compila (d) Si (monaux x ) diverge entonces (mon x ) diverge
No entiendo por qué la a) es incorrecta y por qué la d) es correcta. El operador >> necesariamente evalúa ambos argumentos?
10. Dadas las siguientes definiciones: data Arbol a = Vacio | Nodo (Arbol a) a (Arbol a) genera = fst $ generaAux 0 where generaAux n = let (l, n0) = generaAux (n + 1) (r , n00) = generaAux n0 in (Nodo l n r , n00) recorreL (Nodo l x ) = x : recorreL l recorreL Vacio = [ ] recorreR (Nodo x r ) = x : recorreR r recorreR Vacio = [ ] recorre (Nodo l x r ) = recorre l ++ [x ] ++ recorre r recorre Vacio = [ ]
Entiendo que la expresión de la parte b) (take 5 ◦ tail ◦ recorreR $ genera) diverge, pero no entiendo entonces por qué no lo hace d) (head $ zip (recorreL genera) (recorreR genera)).
Muchas gracias y saludos!