Eu estava tentando criar um thread e esperar no thread principal, mas era um pouco complexo ( https://gist.github.com/3469872 ): tive que criar um MVar ou Chan para saber quando o thread está pronto.
Esta é a melhor maneira de usar 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 ()