2014-11-23 11 views
5

Si consideri il seguente programma:Haskell non raccoglie i rifiuti in testa a un elenco?

module Main where 

import Control.Monad.List 

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

Idealmente, vorremmo la lista da garbage collection come noi consumiamo, in modo che questo programma utilizza solo la memoria costante. Ma quando ho compilato ed eseguito con

ghc Main.hs -O2 -o Main

vedo che continuare a utilizzare sempre di più memoria. Come convinco Haskell a GC gli elementi consumati della lista?

risposta

10

Lo ListT in transformers non esegue lo streaming o l'esecuzione in uno spazio costante. Lo ListT in pipes sì!

import Control.Monad (mzero) 
import Pipes 

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

Ho anche appena caricato pipes-4.1.4 oggi, che rilassa runListT per non richiedere l'mzero alla fine, così poi sarebbe solo:

-- Requires `pipes-4.1.4` 
import Pipes 

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