[Prueba 2017 - versión 1] [Ej 10]

[Prueba 2017 - versión 1] [Ej 10]

de Martin Tadashi Calcagno Sato -
Número de respuestas: 4

Buenas, no entiendo porqué la parte h (igual a la parte a de la versión 2) da como resultado 4. 


   (length . take 4 . tail . repeat . recorre $ genera)


La función recorre genera una lista infinita empezando desde el medio, por lo tanto al usarla de parámetro para otro función no debería diverger?

Además, la función repeat es de tipo: a -> [a], se le puede pasar como parámetro la lista que devuelve recorre?


Otra duda del ejercicio en general: que devolvería la segunda componente de generaAux n? Devuelve n? No veo la relación entre el n que se le pasa de parámetro y el n devuelve. No entiendo como se genera ese valor de retorno.

En respuesta a Martin Tadashi Calcagno Sato

Re: [Prueba 2017 - versión 1] [Ej 10]

de Marcos Viera - InCo -

El parámetro puede ser una lista potencialmente infinita, pero si la función que la consume no la consume toda (y la generación de la lista siempre produce lo que se vaya a consumir) entonces no hay divergencia.

En este caso la lista infinita se pasa a repeat, que genera una lista infinita que contiene listas infinitas.

Esa lista infinita se pasa a tail, que simplemente ignora la cabeza.

Esa lista se pasa a take 4, que retorna una lista de cuatro elementos, todos ellos listas infinitas.

Finalmente esa lista se pasa a length, que cuenta la cantidad de elementos sin analizarlos, por lo tanto no hay divergencia.


Sobre el n de generaAux (que sabemos que es un número), ese valor nunca se va a producir, dado que es el resultado de una recursión infinita que además no tiene paso base. Lo importante es que si se llega a usar eso causaría una divergencia. Si no se usa, no hay problema.


En respuesta a Marcos Viera - InCo

Re: [Prueba 2017 - versión 1] [Ej 10]

de Agustina Sierra Lima -

Yo no entiendo la def de geneeraux.

genera=fst$generaAux 0

wheregeneraAux n =let(l,n′) =generaAux(n+ 1)

                                     (r,n′′) =generaAux n′

                                     in(Nodo l n r,n′′)

Para mi eso no termina nunca osea genera nunca llega a generar nada . Poruqe nisiquiera puede saber el valor de el fst de la tupla. Entonces porque : (take5◦tail◦recorreL$genera) Da [1,2,3,4,5].

osea el redex mas externo es toda la expresion el de la izquierda es (take5◦tail◦recorreL).Pero para poder aplicar eso (por mas que pueda hacer un par de pasos de la composicion) necesito saber algo de genera y genera no devuelve nada , estaba segura q eso divergia pero no.

En respuesta a Agustina Sierra Lima

Re: [Prueba 2017 - versión 1] [Ej 10]

de Martin Tadashi Calcagno Sato -
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)