summaryrefslogtreecommitdiff
path: root/snip/snip.hs
blob: cf2db1f8b65960ea775415e6c53ffe4437d31c53 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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)