Control.Monad.Par.Class

abstract-par-0.3.3: Type classes generalizing the functionality of the 'monad-par' library.

Safe Haskell | Safe
Language | Haskell98

Control.Monad.Par.Class

Contents

- Futures
- IVars

Description

This module establishes a class hierarchy that captures the interfaces of `Par` monads. There are two layers: simple futures (`ParFuture`) and full `IVars` (`ParIVar`). All `Par` monads are expected to implement the former, some also implement the latter.

For more documentation of the programming model, see

- The Control.Monad.Par module in the `monad-par` package.
- The wiki/tutorial (http://www.haskell.org/haskellwiki/Par_Monad:_A_Parallelism_Tutorial)
- The original paper (http://www.cs.indiana.edu/~rrnewton/papers/haskell2011_monad-par.pdf)
- Tutorial slides (http://community.haskell.org/~simonmar/slides/CUFP.pdf)
- Other slides (http://www.cs.ox.ac.uk/ralf.hinze/WG2.8/28/slides/simon.pdf, http://www.cs.indiana.edu/~rrnewton/talks/2011_HaskellSymposium_ParMonad.pdf)

Synopsis

- class Monad m => ParFuture future m | m -> future where
- class ParFuture ivar m => ParIVar ivar m | m -> ivar where
- class NFData a

# Futures

class Monad m => ParFuture future m | m -> future where #

`ParFuture` captures the class of Par monads which support futures. This level of functionality subsumes `par`/`pseq` and is similar to the Control.Parallel.Strategies.Eval monad.

A minimal implementation consists of `spawn_` and `get`. However, for monads that are also a member of `ParIVar` it is typical to simply define `spawn` in terms of `fork`, `new`, and `put`.

Minimal complete definition

spawn_, get

Methods

spawn :: NFData a => m a -> m (future a) #

Create a potentially-parallel computation, and return a future (or promise) that can be used to query the result of the forked computataion.

     spawn p = do
       r <- new
       fork (p >>= put r)
       return r

spawn_ :: m a -> m (future a) #

Like `spawn`, but the result is only head-strict, not fully-strict.

get :: future a -> m a #

Wait for the result of a future, and then return it.

spawnP :: NFData a => a -> m (future a) #

Spawn a pure (rather than monadic) computation. Fully-strict.

     spawnP = spawn . return

# IVars

class ParFuture ivar m => ParIVar ivar m | m -> ivar where #

`ParIVar` builds on futures by adding full anyone-writes, anyone-reads IVars. These are more expressive but may not be supported by all distributed schedulers.

A minimal implementation consists of `fork`, `put_`, and `new`.

Minimal complete definition

fork, new, put_

Methods

fork :: m () -> m () #

Forks a computation to happen in parallel. The forked computation may exchange values with other computations using `IVar`s.

new :: m (ivar a) #

creates a new `IVar`

put :: NFData a => ivar a -> a -> m () #

put a value into a `IVar`. Multiple `put`s to the same `IVar` are not allowed, and result in a runtime error.

`put` fully evaluates its argument, which therefore must be an instance of `NFData`. The idea is that this forces the work to happen when we expect it, rather than being passed to the consumer of the `IVar` and performed later, which often results in less parallelism than expected.

Sometimes partial strictness is more appropriate: see `put_`.

put_ :: ivar a -> a -> m () #

like `put`, but only head-strict rather than fully-strict.

newFull :: NFData a => a -> m (ivar a) #

creates a new `IVar` that contains a value

newFull_ :: a -> m (ivar a) #

creates a new `IVar` that contains a value (head-strict only)

class NFData a #

A class of types that can be fully evaluated.

Since: 1.1.0.0

Instances

NFData Bool |
Methods rnf :: Bool -> () #
NFData Char |
Methods rnf :: Char -> () #
NFData Double |
Methods rnf :: Double -> () #
NFData Float |
Methods rnf :: Float -> () #
NFData Int |
Methods rnf :: Int -> () #
NFData Int8 |
Methods rnf :: Int8 -> () #
NFData Int16 |
Methods rnf :: Int16 -> () #
NFData Int32 |
Methods rnf :: Int32 -> () #
NFData Int64 |
Methods rnf :: Int64 -> () #
NFData Integer |
Methods rnf :: Integer -> () #
NFData Word |
Methods rnf :: Word -> () #
NFData Word8 |
Methods rnf :: Word8 -> () #
NFData Word16 |
Methods rnf :: Word16 -> () #
NFData Word32 |
Methods rnf :: Word32 -> () #
NFData Word64 |
Methods rnf :: Word64 -> () #
NFData CallStack | Since: 1.4.2.0
Methods rnf :: CallStack -> () #
NFData TypeRep | NOTE: Only defined for `base-4.8.0.0` and later Since: 1.4.0.0
Methods rnf :: TypeRep -> () #
NFData () |
Methods rnf :: () -> () #
NFData TyCon | NOTE: Only defined for `base-4.8.0.0` and later Since: 1.4.0.0
Methods rnf :: TyCon -> () #
NFData Natural | Since: 1.4.0.0
Methods rnf :: Natural -> () #
NFData Void | Defined as ``rnf` = `absurd``. Since: 1.4.0.0
Methods rnf :: Void -> () #
NFData Version | Since: 1.3.0.0
Methods rnf :: Version -> () #
NFData Unique | Since: 1.4.0.0
Methods rnf :: Unique -> () #
NFData ThreadId | Since: 1.4.0.0
Methods rnf :: ThreadId -> () #
NFData ExitCode | Since: 1.4.2.0
Methods rnf :: ExitCode -> () #
NFData CChar | Since: 1.4.0.0
Methods rnf :: CChar -> () #
NFData CSChar | Since: 1.4.0.0
Methods rnf :: CSChar -> () #
NFData CUChar | Since: 1.4.0.0
Methods rnf :: CUChar -> () #
NFData CShort | Since: 1.4.0.0
Methods rnf :: CShort -> () #
NFData CUShort | Since: 1.4.0.0
Methods rnf :: CUShort -> () #
NFData CInt | Since: 1.4.0.0
Methods rnf :: CInt -> () #
NFData CUInt | Since: 1.4.0.0
Methods rnf :: CUInt -> () #
NFData CLong | Since: 1.4.0.0
Methods rnf :: CLong -> () #
NFData CULong | Since: 1.4.0.0
Methods rnf :: CULong -> () #
NFData CLLong | Since: 1.4.0.0
Methods rnf :: CLLong -> () #
NFData CULLong | Since: 1.4.0.0
Methods rnf :: CULLong -> () #
NFData CFloat | Since: 1.4.0.0
Methods rnf :: CFloat -> () #
NFData CDouble | Since: 1.4.0.0
Methods rnf :: CDouble -> () #
NFData CPtrdiff | Since: 1.4.0.0
Methods rnf :: CPtrdiff -> () #
NFData CSize | Since: 1.4.0.0
Methods rnf :: CSize -> () #
NFData CWchar | Since: 1.4.0.0
Methods rnf :: CWchar -> () #
NFData CSigAtomic | Since: 1.4.0.0
Methods rnf :: CSigAtomic -> () #
NFData CClock | Since: 1.4.0.0
Methods rnf :: CClock -> () #
NFData CTime | Since: 1.4.0.0
Methods rnf :: CTime -> () #
NFData CUSeconds | Since: 1.4.0.0
Methods rnf :: CUSeconds -> () #
NFData CSUSeconds | Since: 1.4.0.0
Methods rnf :: CSUSeconds -> () #
NFData CFile | Since: 1.4.0.0
Methods rnf :: CFile -> () #
NFData CFpos | Since: 1.4.0.0
Methods rnf :: CFpos -> () #
NFData CJmpBuf | Since: 1.4.0.0
Methods rnf :: CJmpBuf -> () #
NFData CIntPtr | Since: 1.4.0.0
Methods rnf :: CIntPtr -> () #
NFData CUIntPtr | Since: 1.4.0.0
Methods rnf :: CUIntPtr -> () #
NFData CIntMax | Since: 1.4.0.0
Methods rnf :: CIntMax -> () #
NFData CUIntMax | Since: 1.4.0.0
Methods rnf :: CUIntMax -> () #
NFData All | Since: 1.4.0.0
Methods rnf :: All -> () #
NFData Any | Since: 1.4.0.0
Methods rnf :: Any -> () #
NFData Fingerprint | Since: 1.4.0.0
Methods rnf :: Fingerprint -> () #
NFData SrcLoc | Since: 1.4.2.0
Methods rnf :: SrcLoc -> () #
NFData a => NFData [a] |
Methods rnf :: [a] -> () #
NFData a => NFData (Maybe a) |
Methods rnf :: Maybe a -> () #
NFData a => NFData (Ratio a) |
Methods rnf :: Ratio a -> () #
NFData (Ptr a) | Since: 1.4.2.0
Methods rnf :: Ptr a -> () #
NFData (FunPtr a) | Since: 1.4.2.0
Methods rnf :: FunPtr a -> () #
NFData a => NFData (Identity a) | Since: 1.4.0.0
Methods rnf :: Identity a -> () #
NFData a => NFData (Min a) | Since: 1.4.2.0
Methods rnf :: Min a -> () #
NFData a => NFData (Max a) | Since: 1.4.2.0
Methods rnf :: Max a -> () #
NFData a => NFData (First a) | Since: 1.4.2.0
Methods rnf :: First a -> () #
NFData a => NFData (Last a) | Since: 1.4.2.0
Methods rnf :: Last a -> () #
NFData m => NFData (WrappedMonoid m) | Since: 1.4.2.0
Methods rnf :: WrappedMonoid m -> () #
NFData a => NFData (Option a) | Since: 1.4.2.0
Methods rnf :: Option a -> () #
NFData a => NFData (NonEmpty a) | Since: 1.4.2.0
Methods rnf :: NonEmpty a -> () #
NFData (Fixed a) | Since: 1.3.0.0
Methods rnf :: Fixed a -> () #
NFData a => NFData (Complex a) |
Methods rnf :: Complex a -> () #
NFData (StableName a) | Since: 1.4.0.0
Methods rnf :: StableName a -> () #
NFData a => NFData (ZipList a) | Since: 1.4.0.0
Methods rnf :: ZipList a -> () #
NFData a => NFData (Dual a) | Since: 1.4.0.0
Methods rnf :: Dual a -> () #
NFData a => NFData (Sum a) | Since: 1.4.0.0
Methods rnf :: Sum a -> () #
NFData a => NFData (Product a) | Since: 1.4.0.0
Methods rnf :: Product a -> () #
NFData a => NFData (First a) | Since: 1.4.0.0
Methods rnf :: First a -> () #
NFData a => NFData (Last a) | Since: 1.4.0.0
Methods rnf :: Last a -> () #
NFData (IORef a) | NOTE: Only strict in the reference and not the referenced value. Since: 1.4.2.0
Methods rnf :: IORef a -> () #
NFData a => NFData (Down a) | Since: 1.4.0.0
Methods rnf :: Down a -> () #
NFData (MVar a) | NOTE: Only strict in the reference and not the referenced value. Since: 1.4.2.0
Methods rnf :: MVar a -> () #
NFData (a -> b) | This instance is for convenience and consistency with `seq`. This assumes that WHNF is equivalent to NF for functions. Since: 1.3.0.0
Methods rnf :: (a -> b) -> () #
(NFData a, NFData b) => NFData (Either a b) |
Methods rnf :: Either a b -> () #
(NFData a, NFData b) => NFData (a, b) |
Methods rnf :: (a, b) -> () #
(NFData a, NFData b) => NFData (Array a b) |
Methods rnf :: Array a b -> () #
(NFData a, NFData b) => NFData (Arg a b) | Since: 1.4.2.0
Methods rnf :: Arg a b -> () #
NFData (Proxy k a) | Since: 1.4.0.0
Methods rnf :: Proxy k a -> () #
NFData (STRef s a) | NOTE: Only strict in the reference and not the referenced value. Since: 1.4.2.0
Methods rnf :: STRef s a -> () #
(NFData a, NFData b, NFData c) => NFData (a, b, c) |
Methods rnf :: (a, b, c) -> () #
NFData a => NFData (Const k a b) | Since: 1.4.0.0
Methods rnf :: Const k a b -> () #
(NFData a, NFData b, NFData c, NFData d) => NFData (a, b, c, d) |
Methods rnf :: (a, b, c, d) -> () #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) => NFData (a1, a2, a3, a4, a5) |
Methods rnf :: (a1, a2, a3, a4, a5) -> () #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6) => NFData (a1, a2, a3, a4, a5, a6) |
Methods rnf :: (a1, a2, a3, a4, a5, a6) -> () #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7) => NFData (a1, a2, a3, a4, a5, a6, a7) |
Methods rnf :: (a1, a2, a3, a4, a5, a6, a7) -> () #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7, NFData a8) => NFData (a1, a2, a3, a4, a5, a6, a7, a8) |
Methods rnf :: (a1, a2, a3, a4, a5, a6, a7, a8) -> () #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7, NFData a8, NFData a9) => NFData (a1, a2, a3, a4, a5, a6, a7, a8, a9) |
Methods rnf :: (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> () #