2014-11-23 11 views
5

Betrachten Sie das folgende Programm:Haskell sammelt nicht Müll den Kopf einer Liste?

module Main where 

import Control.Monad.List 

main = runListT $ do 
    x <- ListT $ return $ [0..1000000000] 
    lift $ print x 

Idealerweise würden wir die Liste Müll gesammelt werden, wie wir sie verbrauchen, so dass dieses Programm nur konstant Speicher verwendet. Aber wenn ich kompilieren und führen Sie es mit

ghc Main.hs -O2 -o Main

Ich sehe, dass es mehr und mehr Speicher verwenden halten. Wie überzeuge ich Haskell, die verbrauchten Elemente der Liste zu GC zu zählen?

Antwort

10

Die ListT in transformers streamen oder laufen nicht in konstantem Raum. Die ListT in pipes tut!

import Control.Monad (mzero) 
import Pipes 

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

ich auch nur pipes-4.1.4 heute hochgeladen, die runListT entspannt nicht zu verlangen, die mzero am Ende, so ist, dann wäre es nur sein:

-- Requires `pipes-4.1.4` 
import Pipes 

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