Как я понимаю, Haskell только мусор собирает, когда что-то выходит за рамки, поэтому привязка верхнего уровня будет оцениваться только один раз и никогда не выходит за рамки. Поэтому, если я запустил этот код в GHCI, первые 50 элементов будут оценены и сохранены.
let xs = map f [0..]
take 50 xs
Мои вопросы - это то, что происходит, когда я выполняю следующий фрагмент: xs !! 99
. Что спасает сборщик мусора? Это
- Сохранять результаты для индексов 0 - 49, thunk для индексов 50 - 98, результат для индекса 99, thunk для индексов 100 +
- Сохранять результаты для индексов 0 - 49, thunk для индексов 50 +
- Сохранять результаты для индексов 0 - 99, thunk для индексов 100 +