Haskell不会垃圾回收列表的头部吗?

5

Consider the following program:

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回收已使用的列表元素呢?
1个回答

10

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) )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接