I found the "weird" behavior here. I got it:
{-# LANGUAGE BangPatterns #-} import Data.List import Control.Parallel import Control.Parallel.Strategies fib 0 = 1 fib 1 = 1 fib n = fib (n-1) + fib (n-2) main = let xs = [ fib (20 + n `mod` 2) | n <- [0..1000] ] `using` test rseq in print (sum xs) test :: Strategy a -> Strategy [a] test strat xs = do parTraversable strat xs -- case #1 -- parList strat xs -- case #2 return xs
case #1 means using parTraversable , case #2 means using parList . The results are different:
case
As far as I know, parList same as parTraversable . In Control/Parallel/Strategies.hs :
parTraversable :: Traversable t => Strategy a -> Strategy (ta) parTraversable strat = evalTraversable (rparWith strat) parList :: Strategy a -> Strategy [a] parList = parTraversable
Therefore, I believed that they should act in the same way. Anything to reveal here?
Update # 1 :
Commands to compile and run:
stack ghc -- -O2 -threaded -rtsopts -eventlog parlist2.hs ./parList2 +RTS -N2 -s
parallel-processing haskell
Vลฉ tรด
source share