import Control.Monad.Writer import Control.Monad.State import Data.Tuple.Extra (dupe,first,second) import System.Environment (getArgs) import Control.Parallel.Strategies (parMap,rseq,rdeepseq) main = do mainMonTra mainParMap -- monad transformers in action mainMonTra = print $ runState ( runWriterT ( get >>= \a -> tell ["foo"] >> put (a*a) >> tell ["bar"] >> tell [show a] ) ) 5 -- parallel Map arguments: sparks maps mainParMap = do (sparks:max:_) <- fmap (map read) getArgs let ranges = uncurry zip . second tail . dupe $ [0,(max`div`sparks)..max] let sums = parMap rdeepseq (\(a,b)->sum [a+1..b]) ranges print $ show (sum sums::Integer)