summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--snip/snip.hs17
1 files changed, 16 insertions, 1 deletions
diff --git a/snip/snip.hs b/snip/snip.hs
index 4b7b461..cf2db1f 100644
--- a/snip/snip.hs
+++ b/snip/snip.hs
@@ -1,8 +1,16 @@
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
-main = print $
+mainMonTra = print $
runState (
runWriterT (
get >>= \a ->
@@ -12,3 +20,10 @@ main = print $
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)