The Eval monad and strategies

The first abstraction we will look at is the Control.Parallel.Strategies module from the parallel package. The core Strategy API consists of the following:

data Eval a
instance Monad Eval

type Strategy a = a → Eval a

runEval :: Eval a → a

using :: a → Strategy a → a

rseq :: Strategy a
rdeepseq :: NFData a => Strategy a
rpar :: Strategy a

The principle is to use using or runEval to evaluate a lazy data structure in parallel, using some strategy. Essentially we have separated the algorithm (a lazy data structure) from the parallel evaluation (a strategy).

As a simple example, consider calculating the minimum and maximum elements of many lists in parallel. We write an algorithm, which doesn't encode any parallelism, called ...

Get Haskell High Performance Programming now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.