On Thu, 6 Sep 2007, Axel Gerstenberger wrote:

module Main where

import System.IO
import Text.Printf

main :: IO ()
main = do
   let all_results1 = take 20000 $ step [1]
   --print $ length all_results1 -- BTW: if not commented out,
                                 --      all values of all_results
                                 --      are already
                                 --      calculated here
   loop [1..50] $ \i -> do
       let x = all_results1!!i
       putStrLn $ show i ++ "  " ++ show x

The guilty thing is (!!). Better write

loop all_results1 $ \x -> do
      putStrLn $ show i ++ "  " ++ show x

In your program, the reference to the beginning of the list all_results1 is kept throughout the loop and thus the garbage collector cannot free the memory.

('loop' is available as 'forM_' in GHC-6.6
   
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad.html#v%3AforM_)


See also:
 http://www.haskell.org/haskellwiki/Things_to_avoid#Lists_are_not_arrays
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to