Ejercicio 9 - 2017

Ejercicio 9 - 2017

de Luis Martin Nogueira Techera -
Número de respuestas: 2

Hola, mi duda es con la siguiente evaluación:

ffl p = foldl (λys x→ if p x then x:ys else ys ) [ ]

El resultado de evaluar ( head $ ffl(>0) [1 ,inf, 3]) es 3

No logro entender como retorna 3 dado que foldl usa operadores que asocian desde la izquierda  y antes de la función lambda meter el 3 en la lista debe pasar por inf el cual sabemos que "(>0) inf" diverge.

Entiendo que por lazy evaluation si el 3 fuera el primero gracias al head retorna ese valor y no sigue evaluando.Pero yo pensaba que primero foldl va evaluar 1 luego inf y luego el 3.

Gracias.





En respuesta a Luis Martin Nogueira Techera

Re: Ejercicio 9 - 2017

de Marcos Viera - InCo -

lo que sucede es que head pide que la aplicación de ffl retorne algo con la forma (x:_), para eso el foldl, como es tail recursive, recorre toda la lista para retornar algo, y lo que retorna es algo de la forma  (lo voy a poner como call by name, pero es lo mismo, con lazy además habría sharing)

 if (>0) 3 then 3 : (if (>0) inf then inf:(if (>0) 1 then 1:[] else []) else (if (>0) 1 then 1:[] else [])) else (if (>0) inf then inf:(if (>0) 1 then 1:[] else []) else (if (>0) 1 then 1:[] else []))

lo que al dar un paso de evaluación retorna

3 : (if (>0) inf then inf:(if (>0) 1 then 1:[] else []) else (if (>0) 1 then 1:[] else []))

que tiene la forma requerida por el head, que retorna

3