import Control.Monad.ST import Data.Array.ST import Data.Array.Unboxed rev :: UArray Int Int -> UArray Int Int rev ary = runSTUArray $ do ary <- thaw ary :: ST s (STUArray s Int Int) (l,r) <- getBounds ary rev' ary l r ((r - l + 1) `div` 2) 0 return ary where rev' ary init end len n | n < len = do let (a,b) = (init + n, end - n) x <- readArray ary a y <- readArray ary b writeArray ary a y writeArray ary b x rev' ary init end len (n+1) | otherwise = return () size = 1000000 main = print $ (rev $ runSTUArray $ newListArray (1, size) [1..size]) ! 1