2014-11-23 6 views
5

Рассмотрим следующую программу:Haskell не мусор собирает голову списка?

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 в GC потребляемые элементы списка?

ответ

10

ListT в transformers не работает и не работает в постоянном пространстве. ListT в pipes делает!

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)) 
Смежные вопросы