{-# OPTIONS_GHC -Wall -fno-warn-name-shadowing #-} module Main where import Control.Monad.Par.Scheds.Trace -- gives slightly better results than Control.Monad.Par with monad-par-0.3.4 import System.Environment test :: Int -> Int -> Par Int test n m = do i <- new -- create an IVar j <- new -- create an IVar fork (put i (fib n)) -- start a parallel task fork (put j (fib m)) -- start a parallel task a <- get i -- get the result (when available) b <- get j -- get the result (when available) return (a+b) -- return the result fib :: Int -> Int fib 0 = 1 fib 1 = 1 fib n = nf1+nf2+1 where nf1 = fib (n-1) nf2 = fib (n-2) pfib :: Int -> Par Int pfib n | n<=1 = return 1 -- do { resv <- new; put resv 1 ; return resv } pfib n | otherwise = do nv1 <- spawn (pfib (n-1)) -- start a parallel task nv2 <- spawn (pfib (n-2)) -- start a parallel task nf1 <- get nv1 -- get the result (when available) nf2 <- get nv2 -- get the result (when available) return (nf1+nf2+1) main = do args <- getArgs let n = read (args!!0) :: Int m = read (args!!1) :: Int putStr ("Running a test of: fib " ++ (show n) ++ " + fib " ++ (show m) ++ " = ") let res = runPar $ test m n putStrLn (show res)