Haskell Lazy Evaluación y reutilización

Sé que si tuviera que calcular una lista de cuadrados en Haskell, podría hacer esto:

squares = [ x ** 2 | x <- [1 ..] ]

Luego, cuando llamo cuadrados como este:

print $ take 4 squares

Y se imprimiría [1.0, 4.0, 9.0, 16.0]. Esto se evalúa como [1 ** 2, 2 ** 2, 3 ** 2, 4 ** 2]. Ahora, dado que Haskell es funcional y el resultado sería el mismo cada vez, si volviera a llamar a los cuadrados en otro lugar, ¿volvería a evaluar las respuestas que ya se calcularon? Si tuviera que reutilizar cuadrados después de haber llamado a la línea anterior, ¿volvería a calcular los primeros 4 valores?

print $ take 5 squares

¿Evaluaría [1.0, 4.0, 9.0, 16.0, 5 ** 2]?

Respuestas a la pregunta(4)

Su respuesta a la pregunta