Haskell不垃圾收集列表的头部?

时间:2014-11-23 23:42:15

标签: performance haskell garbage-collection

考虑以下计划:

module Main where

import Control.Monad.List

main = runListT $ do
  x <- ListT $ return $ [0..1000000000]
  lift $ print x

理想情况下,我们希望列表在我们使用时被垃圾收集,因此该程序仅使用常量内存。但是当我用

编译并运行它时

ghc Main.hs -O2 -o Main

我看到它继续使用越来越多的内存。如何让Haskell向GC说服列表中消耗的元素?

1 个答案:

答案 0 :(得分:10)

ListT中的transformers不会在常量空间中流式传输或运行。 ListT中的pipes可以!

import Control.Monad (mzero)
import Pipes

main = runListT (do
    x <- Select (each [0..1000000000])
    lift (print x)
    mzero )

我今天刚刚上传了pipes-4.1.4,放宽了runListT,最后不需要mzero,所以那就是:

-- Requires `pipes-4.1.4`
import Pipes

main = runListT (do
    x <- Select (each [0..1000000000])
    lift (print x) )