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]?