【问题标题】:Haskell does not garbage collect the head of a list?Haskell不会垃圾收集列表的头部吗?
【发布时间】:2014-11-24 08:38:31
【问题描述】:
考虑以下程序:
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 列表中消耗的元素?
【问题讨论】:
标签:
performance
haskell
garbage-collection
【解决方案1】:
transformers 中的 ListT 不会在恒定空间中流式传输或运行。 pipes 中的 ListT 可以!
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) )