fork download
  1. import Data.Array.IO
  2.  
  3. rev :: IOUArray Int Int -> IO ()
  4. rev ary = do
  5. (l,r) <- getBounds ary
  6. rev' ary l r ((r - l + 1) `div` 2) 0
  7. return ()
  8. where
  9. rev' ary init end len n
  10. | n < len = do
  11. let (a,b) = (init + n, end - n)
  12. x <- readArray ary a
  13. y <- readArray ary b
  14. writeArray ary a y
  15. writeArray ary b x
  16. rev' ary init end len (n+1)
  17. | otherwise = return ()
  18.  
  19. size = 1000000
  20. main = do
  21. ary <- newListArray (1, size) [1..size] :: IO (IOUArray Int Int)
  22. rev ary
  23. print =<< readArray ary 1
Success #stdin #stdout 0.05s 7680KB
stdin
Standard input is empty
stdout
1000000