Я знаю, что если бы я вычислил список квадратов в Haskell, я мог бы сделать это:
squares = [ x ** 2 | x <- [1 ..] ]
Тогда, когда я вызываю квадраты следующим образом:
print $ take 4 squares
И он распечатает [1.0, 4.0, 9.0, 16.0]. Это оценивается как [1 ** 2, 2 ** 2, 3 ** 2, 4 ** 2]. Теперь, поскольку Haskell является функциональным, и каждый результат будет один и тот же, если бы я снова должен был называть квадраты где-то в другом месте, будет ли он переоценивать ответы, которые он уже вычислил? Если бы я повторно использовал квадраты после того, как я уже вызвал предыдущую строку, перерасчет первых 4 значений?
print $ take 5 squares
Будет ли он оцениваться [1.0, 4.0, 9.0, 16.0, 5 ** 2]?