Parcial 2022, 1era instancia, ejercicio 7

Parcial 2022, 1era instancia, ejercicio 7

de Nicolas Grosso San Roman -
Número de respuestas: 1

Hola, 

sobre la parte b):

realicé la secuencia de que lo iría pasando teniendo en cuenta el lazy evaluation, pero llegué a que era divergente. Esto fue porque, en la línea 5, no decidí evaluar la función ((:).head) [2,1,1], sino que decidí seguir con el foldr, el cual claramente diverge. Pero si primero realizo ((:).head) [2,1,1], claramente luego el head de afuera ya tiene una lista para funcionar (línea 6), por lo que retorna 2. 

No me queda claro aquí cómo se decide qué camino hacer antes.


Saludos!

En respuesta a Nicolas Grosso San Roman

Re: Parcial 2022, 1era instancia, ejercicio 7

de Marcos Viera - InCo -
Siempre intento reducir la aplicación más externa, si no puedo, me meto a reducir sus argumentos (de izquierda a derecha) hasta llegar a un estado en el que pueda reducir.
Para ver si puede quedar claro, voy poner las reducciones que hiciste, comentando qué se intentaría hacer en cada paso:

head (foldr ((:) . head) [] (tail cs))
- no puedo reducir head, entonces reduzco su argumento hasta poder
- no puedo reducir foldr, entonces reduzco sus argumentos (de izquierda a derecha)
- la composición no se puede reducir, tampoco []
- reduzco tail
head (foldr ((:) . head) [] (tail ([1,1]:map (\(x:y:xs) -> x+y:x:y:xs) cs)))
== head (foldr ((:) . head) [] (map (\(x:y:xs) -> x+y:x:y:xs) cs))
- sigo sin poder reducir head
- sigo sin poder reducir foldr
- la composición no se puede reducir, tampoco []
- reduzco map
head (foldr ((:) . head) [] (map (\(x:y:xs) -> x+y:x:y:xs) cs))
== head (foldr ((:) . head) [] (map (\(x:y:xs) -> x+y:x:y:xs) ([1,1]:map (\(x:y:xs) -> x+y:x:y:xs) cs)))
== head (foldr ((:) . head) [] ([2,1,1]:map (\(x:y:xs) -> x+y:x:y:xs) (map (\(x:y:xs) -> x+y:x:y:xs) cs)))
- sigo sin poder reducir head
- puedo reducir el foldr
head (foldr ((:) . head) [] ([2,1,1]:map (\(x:y:xs) -> x+y:x:y:xs) (map (\(x:y:xs) -> x+y:x:y:xs) cs)))
== head (((:) . head) [2,1,1] (foldr ((:) . head) [] (map (\(x:y:xs) -> x+y:x:y:xs) (map (\(x:y:xs) -> x+y:x:y:xs) cs))))
- sigo sin poder reducir head
- tengo la aplicación de la composición a [2,1,1] y su resultado luego se aplicaría al foldr. reduzco la aplicación
head (((:) . head) [2,1,1] (foldr ((:) . head) [] (map (\(x:y:xs) -> x+y:x:y:xs) (map (\(x:y:xs) -> x+y:x:y:xs) cs))))
== head (2 : (foldr ((:) . head) [] (map (\(x:y:xs) -> x+y:x:y:xs) (map (\(x:y:xs) -> x+y:x:y:xs) cs))))
...

saludos