
Luca Ciciriello schrieb:
Thanks Carsten, I've compiled your example and all works as expected.
Just a note. If I load the module in GHCi (intead of compiling it) and launch main function the result is quite strange. I obtain:
He lwloorld
So we actually observe the concurrency here, nice.
[(),()]
The result of the computation: Both instances of hPutStr return (), and parallel assembles these into [(),()]. The intersesting thing is that ghci suppresses an IO result if it is of type (), but not otherwise. Prelude> return () :: IO () Prelude> return [(),()] :: IO [()] [(),()] Prelude> I did not know this. Carsten
module Main(main) where
import IO import Control.Concurrent
parallel :: [IO a] -> IO [a] parallel = foldr (\a c -> do v <- newEmptyMVar forkIO (a >>= putMVar v) xs <- c x <- takeMVar v return (x:xs)) (return [])
main = parallel [hPutStr stdout "Hello", hPutStr stdout " world\n"]