考虑以下计划:
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说服列表中消耗的元素?
答案 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) )