小编Sla*_*kov的帖子

Haskell中无限列表的内存使用情况

此代码仅使用1Mb的RAM:

main = putStrLn $ show $ length (take 2000000 [1..])
Run Code Online (Sandbox Code Playgroud)

虽然此代码使用90Mb的RAM:

nums :: [Int]
nums = nextInts 0
  where
    nextInts x = x : nextInts (succ x)

main = putStrLn $ show $ length (take 2000000 nums)
Run Code Online (Sandbox Code Playgroud)

如果我这样改变它,它将再次使用1Mb的RAM:

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)
Run Code Online (Sandbox Code Playgroud)

问题:有人可以解释为什么第二个代码示例将整个列表存储在RAM中,而第三个代码样本没有这样做.还描述了我应该如何更改第二个样本以使用O(1)RAM并且仍然是无限列表.

memory haskell lazy-evaluation ghc

1
推荐指数
1
解决办法
158
查看次数

标签 统计

ghc ×1

haskell ×1

lazy-evaluation ×1

memory ×1