Haskell does not garbage collect the head of a list?

garbage-collection, haskell, performance

Solution

The `ListT` in `transformers` doesn't stream or run in constant space. The `ListT` in `pipes` does!

import Control.Monad (mzero)
import Pipes

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

I also just uploaded `pipes-4.1.4` today, which relaxes `runListT` to not require the `mzero` at the end, so then it would just be:

-- Requires `pipes-4.1.4`
import Pipes

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

Problem

Consider the following program: ``` module Main where import Control.Monad.List main = runListT $ do x <- ListT $ return $ [0..1000000000] lift $ print x ``` Ideally, we would want the list to be garbage collected as we consume it, so that this program only uses constant memory. But when I compile and run it with `ghc Main.hs -O2 -o Main` I see that it keep using more and more memory. How do I convince Haskell to GC the consumed elements of the list?

Original source