Avaliação e reutilização preguiçosas de Haskell

Eu sei que se eu fosse calcular uma lista de quadrados em Haskell, eu poderia fazer o seguinte:

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

Então, quando eu chamo quadrados assim:

print $ take 4 squares

E seria impresso [1.0, 4.0, 9.0, 16.0]. Isso é avaliado como [1 ** 2, 2 ** 2, 3 ** 2, 4 ** 2]. Agora, como Haskell é funcional e o resultado seria o mesmo toda vez, se eu chamasse quadrados novamente em outro lugar, seria reavaliar as respostas já calculadas? Se eu fosse reutilizar quadrados depois de já ter chamado a linha anterior, ele recalcularia os 4 primeiros valores?

print $ take 5 squares

Avaliaria [1.0, 4.0, 9.0, 16.0, 5 ** 2]?

questionAnswers(4)

yourAnswerToTheQuestion