Parcial 206 ej.9

Parcial 206 ej.9

de Leandro Ezequiel Dominguez Perez -
Número de respuestas: 4

Buenas, en el ejercicio 9 te dan la siguiente def. : a = 1 : foldr (λx xs → 1 + x : xs) [ ] a y te piden el resultado de hacer take 4 a.

La solución es [1,2,3,4] , no entiendo como genera el 3 y el 4.

entiendo estos pasos de ejecucion:

-1:foldr (λx xs → 1 + x : xs) [ ] a

-1:((λx xs → 1 + x : xs) 1 (foldr (λx xs → 1 + x : xs) [ ] a) (si aplico un paso de la función lambda)

-1:2: (foldr (λx xs → 1 + x : xs) [ ] a)  (Aca es donde me pierdo , cual es el valor de a en ese momento?)


Gracias



En respuesta a Leandro Ezequiel Dominguez Perez

Re: Parcial 206 ej.9

de Marcos Viera - InCo -

a es exactamente lo que estás generando, así que lo podrías ver como un puntero al inicio de la expresión.

Igual el problema aquí es que hiciste mal el paso de entrar en el foldr, dado que la recursión no es con 'a' sino con el resto de 'a'.


En respuesta a Marcos Viera - InCo

Re: Parcial 206 ej.9

de Melisa Alexandra Arena Mena -

Tengo una duda en cuenta a esto, 

a = 1 : foldr (λx xs → 1 + x : xs) [ ] a  ----  (take 4 a) es [1,2,3,4]

c = 1 : foldl (λxs x → 1 + x : xs) [ ] c   ----- take 4 c  diverge

foldr retorna x1 ⊕ (x2 ⊕ (x3 ⊕ ...(xn ⊕ e)...)) y foldl  (...((v ⊗ x1) ⊗ x2)...) ⊗ xn

Porque take 4 a no diverge, si comienza aplicando la función desde el final de la lista xn y ese final nunca lo tiene?

En cambio en c, comienza con el primero de la lista que si es 1 y sigue iterando hasta tener los cuatro elementos. 

Como lo hace? 

Gracias!




En respuesta a Melisa Alexandra Arena Mena

Re: Parcial 206 ej.9

de Nicolas Lantean Britos -
Yo tenía la misma duda y encontré esto que me ayudó a entender el comportamiento de foldr y foldl


https://stackoverflow.com/questions/3082324/foldl-versus-foldr-behavior-with-infinite-lists