-- parallel.hs

{-
    Compile and run on two threads:

    $ ghc -Wall -O2 -threaded -rtsopts --make parallel.hs"
    $ ./parallel +RTS -N2
 -}

module Main where

-- Installation of additional library may be needed.
-- "cabal install parallel"

import Control.Parallel

-- Do three computations in parallel and sum the result.
main :: IO() 
main = a `par` b `par` c `pseq` print (a + b + c)
    where
        a = ack 3 10
        b = fac 42
        c = fib 34

fac :: Integer -> Integer 
fac 0 = 1
fac n = n * fac (n-1)
 
ack :: Integer -> Integer -> Integer  
ack 0 n = n+1
ack m 0 = ack (m-1) 1
ack m n = ack (m-1) (ack m (n-1))

fib :: Integer -> Integer  
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

--  ------------For GNU Emacs ------------
--  Local Variables:
--  compile-command: "ghc -Wall -O2 -threaded -rtsopts --make parallel.hs"
--  End: