import Data.Array.IO rev :: IOUArray Int Int -> IO () rev ary = do (l,r) <- getBounds ary rev' ary l r ((r - l + 1) `div` 2) 0 return () 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 = do ary <- newListArray (1, size) [1..size] :: IO (IOUArray Int Int) rev ary print =<< readArray ary 1