I was trying to create a thread and wait in main thread, but it was a little bit complex ( https://gist.github.com/3469872 ): had to create an MVar or Chan to know when thread is done.
Here's better way using Control.Concurrent.Async
import Control.Concurrent import Control.Concurrent.Async import System.Random delayedOutput :: String -> IO () delayedOutput m = do gen <- newStdGen let (t, _) = randomR (1, 10) ge -- delay in microseconds threadDelay (t * 1000000) -- display message putStrLn m return () main :: IO () main = do putStrLn "Fight!" a <- async (delayedOutput "Finish him!") wait a return ()