Buenas! Sobre el siguiente ejercicio, no estoy comprendiendo por qué recorreL sí genera resultados, pongo mi proceso debajo de la letra del ejercicio:
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 = []
recorreR (Nodo _ x r) = x : recorreR r
recorreR Vacio = []
¿Cuál es el resultado de evaluar head . tail $ zip (recorreL genera) (recorreR genera)
?
Más allá del resultado final, centrándome en "recorreL genera", mis pasos son los siguientes:
1) recorreL genera
2) recorreL (fst $ generaAux 0)
3) recorreL (fst $ let (l, n') = generaAux (1); (r, n'') = generaAux n'; in (Nodo l 0 r, n''))
4) recorreL (fst $
let (l, n') = (let (l, n') = generaAux (2)
(r, n'') = generaAux n'
in (Nodo l 1 r', n'')
)
(r, n'') = generaAux n'
in (Nodo l 0 r, n'')
)
Y así sucesivamente abriendo el primer generaAux sin parar, ya que recorreL necesita un (Nodo l x _) para matchear, pero esta función nunca termina de retornar un Nodo así, nunca termina de dar una expresión clara para el l, o al menos no entiendo cómo anotarlo o cómo funciona ya que no vi ningún otro ejemplo así.
Sin embargo sé que si hago (take 5 (recorreL genera)) devuelve [0,1,2,3,4] por lo cual de alguna forma está haciendo la sustitución, sólo que no entiendo cómo ya que nunca termina de matchear. Cómo funciona esto?