[Haskell-cafe] Incremental array updates

Eugene Kirpichov ekirpichov at gmail.com
Thu Feb 26 08:56:22 EST 2009


You need to use STUArray. The Data.Array
completely-immutable-and-boxed arrays are ok only for tasks where you
build an array once and don't modify it, and where you need array
elements to be lazy.
The // operation creates a copy of the whole array with one element
modified. It should probably be called
"turtleSlowCopyWholeArrayAndModifySingleElement".

2009/2/26 Daniel Kraft <d at domob.eu>:
> 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 at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>



-- 
Eugene Kirpichov
Web IR developer, market.yandex.ru


More information about the Haskell-Cafe mailing list