2008/2/2, Rodrigo Queiro <[EMAIL PROTECTED]>:
> 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ï
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to