[Prueba 2017] Ejercicios 4, 7 y 10

Re: [Prueba 2017] Ejercicios 4, 7 y 10

de Marcos Viera - InCo -
Número de respuestas: 0
4.
b.
La función `id` tiene tipo:
 
id :: a -> a

Por lo que la puedo aplicar a valores de cualquier tipo. Puedo hacer por ejemplo `id 4`.
En cambio `foo (||) False` tiene tipo
[Bool] -> [Bool]
.

d.
 
foo ($) f xs = map (($) f) xs

Como `($)` es el operador de aplicación, hacer `($) f` equivale a `f`.
Entonces:
 
foo ($) f xs = map f xs


7.
a.
El tipo de `print` es:
 
print :: Show a => a -> IO ()

retornando acciones en la mónada `IO`. Entonces no se puede decir que `mon` es polimórfico con respecto a la mónada `m`.

b. El bind de mónadas obliga a que exista una secuencia en la evaluación de las computaciones, dado que la primera computación debe generar algo para que con eso se construya la segunda computación. Si la primera computación no llega a generar nada, entonces no se construye la segunda.

10.
La función `genera` produce un árbol que tiene infinitos nodos hacia la izquierda, por lo que si intento ir hacia la derecha quedo en una computación divergente.
El tema con la llamada `(head $ zip (recorreL genera) (recorreR genera))` es que el árbol tiene un nodo raíz que tiene el valor `0`, y tanto `recorreL` como `recorreR` colocan el valor del nodo raíz al principio de sus respectivas listas antes de seguir recorriendo. Por lo tanto al avanzar un paso en el `zip` para ambas listas se obtiene `(0,0)` en la cabeza de la lista resultante, que es todo lo que se necesita para evaluar `head`.