Buenas como están? No entiendo por que la b, la g y la h divergen. Si haskell funciona con evaluación perezosa, no debería ser posible calcularlos?
En respuesta a Ivan Alberto Najmias Marjovsky
Re: Prueba 2023 version 1
yo lo que no entiendo es porque map head [loop 1, loop 2, loop 3, loop 4, loop 5] = [1,2,3,4,5] (parte e) mientras que take 5 (loop 3) diverge.
Entiendo que en el take 5 (loop 3) estas pidiendo explicitamente la evaluacion de el loop 3 (lo cual genera una divergencia) y recien despues harias el take 5, y que dado que en la parte e no se pide en ningun momento la evaluacion explicita de los loop, es por eso que no diverge, no?.
Si fuera asi, pasaria que head loop 1 converge a 1 (como ya sabemos por la parte e), pero head (loop 1) divergiria, estoy en lo correcto?.
Entiendo que en el take 5 (loop 3) estas pidiendo explicitamente la evaluacion de el loop 3 (lo cual genera una divergencia) y recien despues harias el take 5, y que dado que en la parte e no se pide en ningun momento la evaluacion explicita de los loop, es por eso que no diverge, no?.
Si fuera asi, pasaria que head loop 1 converge a 1 (como ya sabemos por la parte e), pero head (loop 1) divergiria, estoy en lo correcto?.
Hola,
Les respondo un par de dudas, a ver si con ellas aclaramos todo. Sino pueden volver a consultar.
--- Con respecto a: take 5 (loop 3)
Lo primero que se intenta hacer es reducir la aplicación de take, pero take tiene la siguiente definición (simplificada):
take 0 _ = []
take n [] = []
take n (x:xs) = x : take (n-1) xs
Entonces para poder avanzar en su reducción, tenemos que llegar a que el segundo argumento tenga forma [] o (x:xs). Para eso debemos reducir (loop 3):
loop se define:
loop x = map (const x) (loop x)
con:
map f [] = []
map f (x:xs) = f x : map f xs
entonces:
loop 3 = map (const 3) (loop 3)
para reducir el map tengo que llegar a que la lista tenga forma [] o (x:xs), por lo que tengo que reducir (loop 3) y acabo de entrar en un ciclo.
-- el caso e no diverge porque length no inspecciona los elementos de la lista, entonces nunca se evalúan las suspensiones (head (loop 1)), (head (loop 2)), (head (loop 3)), (head (loop 4)) y (head (loop 5)).
saludos
Les respondo un par de dudas, a ver si con ellas aclaramos todo. Sino pueden volver a consultar.
--- Con respecto a: take 5 (loop 3)
Lo primero que se intenta hacer es reducir la aplicación de take, pero take tiene la siguiente definición (simplificada):
take 0 _ = []
take n [] = []
take n (x:xs) = x : take (n-1) xs
Entonces para poder avanzar en su reducción, tenemos que llegar a que el segundo argumento tenga forma [] o (x:xs). Para eso debemos reducir (loop 3):
loop se define:
loop x = map (const x) (loop x)
con:
map f [] = []
map f (x:xs) = f x : map f xs
entonces:
loop 3 = map (const 3) (loop 3)
para reducir el map tengo que llegar a que la lista tenga forma [] o (x:xs), por lo que tengo que reducir (loop 3) y acabo de entrar en un ciclo.
-- el caso e no diverge porque length no inspecciona los elementos de la lista, entonces nunca se evalúan las suspensiones (head (loop 1)), (head (loop 2)), (head (loop 3)), (head (loop 4)) y (head (loop 5)).
saludos
muchas gracias, creo que me resolvio muchas dudas esto