Этот код используется только 1Мб ОЗУ:памяти бесконечных списков в Haskell
main = putStrLn $ show $ length (take 2000000 [1..])
Хотя этот код использует 90Mb of RAM:
nums :: [Int]
nums = nextInts 0
where
nextInts x = x : nextInts (succ x)
main = putStrLn $ show $ length (take 2000000 nums)
Если изменить это так, то это будет используя снова 1Мб ОЗУ:
nums :: [Int]
nums = nextInts 0
where
nextInts x
|x == 90000000 = [] -- some large number
|otherwise = x : nextInts (succ x)
main = putStrLn $ show $ length (take 2000000 nums)
Вопрос: C кто-то объясняет, почему второй образец кода хранит весь список в ОЗУ, а третий не делает этого. Также опишите, как я должен изменить второй образец, чтобы использовать O (1) RAM и быть списком бесконечности.
'putStrLn. show' is 'print' – nponeccop
' nums' - это точно такой же код, как 'iterate' (источники для библиотечных функций могут быть найдены Hoogle) – nponeccop
Это не то, что происходит в вашем случае: но иногда GHCi будет хранить весь список в ОЗУ только потому, что он находится в корневой области. –