Yo pensé lo mismo al principio, que
generaAux primero llamaba a
(l,n′) =generaAux(n+ 1), y se volvía a llamar recursivamente sin parar, pero en realidad (a mi parecer) primero se está creando el nodo con
(Nodo l n r,n′′), donde
l, r, y n'' son los llamados que indica el let (l sería
fst generaAux(n+1), r sería
fst generaAux(snd generaAux(n+1)), y n'' sería igual que con el r, pero snd).
Entonces generaAux n se podría escribir así:
generaAux n =
(Nodo (fst generaAux(n+1)) n ( fst generaAux (snd generaAux(n+1)) ) ,( snd generaAux (snd generaAux(n+1)) ) )
Ahora genera si te devuelve algo que lo podes aplicar a recorreL sin diverger.
Espero que se entienda (capas que le erre en alguno de los llamados del generaAux)