[Haskell-cafe] Mutable arrays

Chaddaï Fouché chaddai.fouche at gmail.com
Sat Feb 2 12:11:58 EST 2008

2008/2/2, Rodrigo Queiro <overdrigzed at gmail.com>:
> Sorry, I was lazy. New maximum':
> maximum' = foldl1' max

Sorry but none of those propositions change the heart of the problem :
the list of elements is totally produced before she can be consumed
due to the strict monadic (IO or ST) nature of getElems. Thus you get
an extraordinary waste of memory as well as resources...

To address this I propose this function :
foldl1MArray' :: (MArray a e m, Ix i) => (e -> e -> e) -> a i e -> m e
foldl1MArray' f a = do
  (l,u) <- getBounds a
  firstElem <- readArray a l
  foldM (\a mb -> a `seq` mb >>= return . f a)
        firstElem (map (readArray a) (range (l,u)))

With this, we can rewrite the original program using the excellent
modifyArray from Rodrigo :
normalizeArray :: (MArray a e m, Ix i, Fractional e, Ord e) => a i e -> m ()
normalizeArray arr = do
    max_elem <- foldl1MArray' max arr
    modifyArray (* (1/max_elem)) arr


More information about the Haskell-Cafe mailing list