import Control.Monad import Data.Array.ST import Data.Array.Unboxed import Data.List sumInPlace1 :: [Int] -> Int sumInPlace1 xs = (! 0) . runSTUArray $ do a <- newArray (0, 0) 0 forM_ xs $ \x -> do x' <- (readArray a 0) writeArray a 0 (x' + x) return a sumInPlace2 :: [Int] -> Int sumInPlace2 xs = finArr ! 0 where f a x = a // [(0, (a ! 0) + x)] arr = array (0,0) [(0,0)] :: UArray Int Int finArr = foldl' f arr xs sumInPlace = sumInPlace1 main = do let s = sumInPlace [1..1000000] putStrLn $ show s