Autoevaluación Lazy evaluation

Autoevaluación Lazy evaluation

de Ignacio Cabrera -
Número de respuestas: 1

Buenas, tengo algunas dudas con los siguientes ejercicios de la autoevaluación:

1) Dadas las siguientes definiciones: 

xs = 1 : ys ++ [3] 
ys = 2 : xs 

Acá marqué  (last xs) retorna 3 usando evaluación perezosa, aunque la respuesta correcta  ((head . tail . tail) xs) retorna 1 usando evaluación perezosa

también me parece correcta. No entiendo por qué last xs diverge, si se sabe que el último elemento es 3.


2) Indique la función que tiene un comportamiento diferente.

a. iguales xs = null $ filter (/= head xs) xs
b. iguales xs = xs == take (length xs) (repeat (head xs))
c. iguales xs = all (uncurry (==)) $ zip xs (repeat (head xs))
d. iguales xs = and . map (== (head xs)) $ tail xs

Por qué la d tiene comportamiento diferente? No retorna True si los elementos son iguales y False de lo contrario? Por ejemplo si xs = [1,1,1] entonces tail xs = [1,1] luego aplicando map tengo [True, True] y finalmente aplicando and al resultado retorna True. Si tengo xs  = [1,2,1]
tail xs = [2,1], aplicando map retorna [False, True] y finalmente con el and retorna False.

3) Dadas las siguientes definiciones:
data Arbol a = Vacio | Nodo (Arbol a) a (Arbol a)
genera = fst $ generaAux 0
  where generaAux n  =  let  (l,n' )  = generaAux (n+1)
                             (r,n'')  = generaAux n'
                        in   (Nodo  l n r, n'')
recorreL  (Nodo l x _)  = x : recorreL l
recorreL  Vacio         = []

¿Cuál es el resultado de evaluar take 5 . tail . recorreL $ genera?

Acá seguí la sugerencia de evaluar recorreL $ genera, sin embargo no entiendo como se llega a computar la lista [0..] ya que a mi parecer cuando recorreL requiere la evaluación de genera, esta queda en loop infinito ejecutando generaAux (n+1).

En respuesta a Ignacio Cabrera

Re: Autoevaluación Lazy evaluation

de Marcos Viera - InCo -

1) Se sabe que el último elemento es 3, pero para llegar a él hay que recorrer toda la lista.

2) El caso d no funciona para la lista [], dado que siempre se intenta hacer tail. En los demás casos (a,b y c), cuando xs es vacía no se intenta  hacer el head.

3) recorreL sólo necesita que se genere el camino de subárboles a la izquierda, y eso sí lo puede generar genera. Cualquier intento de ir a un subárbol derecho diverge.


saludos