Hi,

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 matters.

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,
Daniel




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)]
    in
      procOne (a + 1) (newarr `seq` newarr)


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

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to