In Haskell, parallel execution (of pure values) boils down to evaluating thunks into WHNF simultaneously. The GHC primitive we can use to annotate parallelism is called par
, exported from the Control.Parallel
module in the parallel
package:
par :: a → b → b
Note that par has exactly the same type as seq
, which is used to control strictness. So whereas a `seq` b
ensures that a
is evaluated when b
is evaluated, a `par` b
evaluates a
in parallel with b
.
Let's start with a simple example. Everyone's favorite naive Fibonacci function appears again. This time, however, we will be calculating multiple Fibonacci numbers simultaneously. The following program prints Fibonacci numbers between 37 and 40:
-- file: fib.hs fib :: Int -> Int fib n | n <= 1 = 1 | otherwise = let a = fib (n - 1) b = fib (n - 2) in a + b main = print $ let x = fib 37 y = fib 38 z = fib 39 w = fib 40 in (x,y...