[Haskell-cafe] Incremental array updates

Daniel Kraft d at domob.eu
Thu Feb 26 08:53:42 EST 2009


I seem to be a little stuck with incremental array updates...  I've got 
an array of "few" (some thousand) integers, but have to do a calculation 
where I incrementally build up the array.  For sake of simplicity, for 
now I don't use a State-Monad but simply pass the array as state down 
the recursive calls.

Unfortunatelly, I seem to experience problems with lazyness; when I run 
my program, memory usage goes up to horrific values!  The simple program 
below reproduces this; when run on my machine, it uses up about 300 MB 
of real and 300 MB of virtual memory, and the system starts swapping 
like mad!  I compiled with ghc --make -O3, ghc version 6.8.3 if that 

BTW, I tried to make the array update strict using the `seq` as below, 
but with no effect...  What am I doing wrong here?

Many thanks,

import Data.Array;

arraySize = 1000
limit = 100000

type MyArray = Array Int Int

emptyArray :: MyArray
emptyArray = array (0, arraySize - 1) [ (i, 0) | i <- [0 .. arraySize - 1] ]

procOne :: Int -> MyArray -> MyArray
procOne a cnt
   | a > limit = cnt
   | otherwise =
     let ind = a `mod` arraySize
         oldcnt = cnt ! ind
         newarr = cnt // [(ind, oldcnt + 1)]
       procOne (a + 1) (newarr `seq` newarr)

main :: IO ()
main =
     arr <- return $ procOne 0 emptyArray
     print $ arr ! 42

More information about the Haskell-Cafe mailing list