Why Haskell Monad IO is useful
If you want to sequence your computation in Haskel, IO Monad can save your life. 
Assume we have $m$ blocks of data and partition it to $n$ small chunks,
e.g [1, 2, 3, 4, 5, 6] => [[1,2], [3, 4], [5, 6]]
and we want to compute those chunks: [1, 2] => [3, 4] => [5, 6] in this order. we can write something like Loop to process them.
iterateList::[a]->(a -> IO ()) -> IO ()
iterateList [] f = return ()
iterateList (x:xs) f = f x >> iterateList xs f

-- how to use it
iterateList bigBlocks(\chunk -> do
            compute chunk
            )