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

yon*_*ong 5 performance garbage-collection haskell

考虑以下程序:

module Main where

import Control.Monad.List

main = runListT $ do
  x <- ListT $ return $ [0..1000000000]
  lift $ print x
Run Code Online (Sandbox Code Playgroud)

理想情况下,我们希望在使用它时对列表进行垃圾收集,以便该程序仅使用常量内存.但是当我编译并运行它时

ghc Main.hs -O2 -o Main

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

Gab*_*lez 10

ListTtransformers不流还是在不断的空间中运行.将ListTpipes呢!

import Control.Monad (mzero)
import Pipes

main = runListT (do
    x <- Select (each [0..1000000000])
    lift (print x)
    mzero )
Run Code Online (Sandbox Code Playgroud)

pipes-4.1.4今天也刚刚上传,放松runListT了不要求mzero最后,所以它只是:

-- Requires `pipes-4.1.4`
import Pipes

main = runListT (do
    x <- Select (each [0..1000000000])
    lift (print x) )
Run Code Online (Sandbox Code Playgroud)