[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
--
Jedaï
More information about the Haskell-Cafe
mailing list