Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell98 |
Control.Monad.Par.Class
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)
Futures
class Monad m => ParFuture future m | m -> future where Source #
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
.
Methods
spawn :: NFData a => m a -> m (future a) Source #
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) Source #
Like spawn
, but the result is only head-strict, not fully-strict.
get :: future a -> m a Source #
Wait for the result of a future, and then return it.
spawnP :: NFData a => a -> m (future a) Source #
Spawn a pure (rather than monadic) computation. Fully-strict.
spawnP = spawn . return
IVars
class ParFuture ivar m => ParIVar ivar m | m -> ivar where Source #
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.
Methods
Forks a computation to happen in parallel. The forked
computation may exchange values with other computations using
IVar
s.
creates a new IVar
put :: NFData a => ivar a -> a -> m () Source #
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 () Source #
like put
, but only head-strict rather than fully-strict.
newFull :: NFData a => a -> m (ivar a) Source #
creates a new IVar
that contains a value
newFull_ :: a -> m (ivar a) Source #
creates a new IVar
that contains a value (head-strict only)
Instances
NFData All | |
Defined in Control.DeepSeq Methods rnf :: All -> () | |
NFData Any | |
Defined in Control.DeepSeq Methods rnf :: Any -> () | |
NFData TypeRep | |
Defined in Control.DeepSeq Methods rnf :: TypeRep -> () | |
NFData Unique | |
Defined in Control.DeepSeq Methods rnf :: Unique -> () | |
NFData Version | |
Defined in Control.DeepSeq Methods rnf :: Version -> () | |
NFData Void | |
Defined in Control.DeepSeq Methods rnf :: Void -> () | |
NFData CBool | |
Defined in Control.DeepSeq Methods rnf :: CBool -> () | |
NFData CChar | |
Defined in Control.DeepSeq Methods rnf :: CChar -> () | |
NFData CClock | |
Defined in Control.DeepSeq Methods rnf :: CClock -> () | |
NFData CDouble | |
Defined in Control.DeepSeq Methods rnf :: CDouble -> () | |
NFData CFile | |
Defined in Control.DeepSeq Methods rnf :: CFile -> () | |
NFData CFloat | |
Defined in Control.DeepSeq Methods rnf :: CFloat -> () | |
NFData CFpos | |
Defined in Control.DeepSeq Methods rnf :: CFpos -> () | |
NFData CInt | |
Defined in Control.DeepSeq Methods rnf :: CInt -> () | |
NFData CIntMax | |
Defined in Control.DeepSeq Methods rnf :: CIntMax -> () | |
NFData CIntPtr | |
Defined in Control.DeepSeq Methods rnf :: CIntPtr -> () | |
NFData CJmpBuf | |
Defined in Control.DeepSeq Methods rnf :: CJmpBuf -> () | |
NFData CLLong | |
Defined in Control.DeepSeq Methods rnf :: CLLong -> () | |
NFData CLong | |
Defined in Control.DeepSeq Methods rnf :: CLong -> () | |
NFData CPtrdiff | |
Defined in Control.DeepSeq Methods rnf :: CPtrdiff -> () | |
NFData CSChar | |
Defined in Control.DeepSeq Methods rnf :: CSChar -> () | |
NFData CSUSeconds | |
Defined in Control.DeepSeq Methods rnf :: CSUSeconds -> () | |
NFData CShort | |
Defined in Control.DeepSeq Methods rnf :: CShort -> () | |
NFData CSigAtomic | |
Defined in Control.DeepSeq Methods rnf :: CSigAtomic -> () | |
NFData CSize | |
Defined in Control.DeepSeq Methods rnf :: CSize -> () | |
NFData CTime | |
Defined in Control.DeepSeq Methods rnf :: CTime -> () | |
NFData CUChar | |
Defined in Control.DeepSeq Methods rnf :: CUChar -> () | |
NFData CUInt | |
Defined in Control.DeepSeq Methods rnf :: CUInt -> () | |
NFData CUIntMax | |
Defined in Control.DeepSeq Methods rnf :: CUIntMax -> () | |
NFData CUIntPtr | |
Defined in Control.DeepSeq Methods rnf :: CUIntPtr -> () | |
NFData CULLong | |
Defined in Control.DeepSeq Methods rnf :: CULLong -> () | |
NFData CULong | |
Defined in Control.DeepSeq Methods rnf :: CULong -> () | |
NFData CUSeconds | |
Defined in Control.DeepSeq Methods rnf :: CUSeconds -> () | |
NFData CUShort | |
Defined in Control.DeepSeq Methods rnf :: CUShort -> () | |
NFData CWchar | |
Defined in Control.DeepSeq Methods rnf :: CWchar -> () | |
NFData ThreadId | |
Defined in Control.DeepSeq Methods rnf :: ThreadId -> () | |
NFData Fingerprint | |
Defined in Control.DeepSeq Methods rnf :: Fingerprint -> () | |
NFData MaskingState | |
Defined in Control.DeepSeq Methods rnf :: MaskingState -> () | |
NFData ExitCode | |
Defined in Control.DeepSeq Methods rnf :: ExitCode -> () | |
NFData Int16 | |
Defined in Control.DeepSeq Methods rnf :: Int16 -> () | |
NFData Int32 | |
Defined in Control.DeepSeq Methods rnf :: Int32 -> () | |
NFData Int64 | |
Defined in Control.DeepSeq Methods rnf :: Int64 -> () | |
NFData Int8 | |
Defined in Control.DeepSeq Methods rnf :: Int8 -> () | |
NFData CallStack | |
Defined in Control.DeepSeq Methods rnf :: CallStack -> () | |
NFData SrcLoc | |
Defined in Control.DeepSeq Methods rnf :: SrcLoc -> () | |
NFData Word16 | |
Defined in Control.DeepSeq Methods rnf :: Word16 -> () | |
NFData Word32 | |
Defined in Control.DeepSeq Methods rnf :: Word32 -> () | |
NFData Word64 | |
Defined in Control.DeepSeq Methods rnf :: Word64 -> () | |
NFData Word8 | |
Defined in Control.DeepSeq Methods rnf :: Word8 -> () | |
NFData Ordering | |
Defined in Control.DeepSeq Methods rnf :: Ordering -> () | |
NFData TyCon | |
Defined in Control.DeepSeq Methods rnf :: TyCon -> () | |
NFData Integer | |
Defined in Control.DeepSeq Methods rnf :: Integer -> () | |
NFData Natural | |
Defined in Control.DeepSeq Methods rnf :: Natural -> () | |
NFData () | |
Defined in Control.DeepSeq Methods rnf :: () -> () | |
NFData Bool | |
Defined in Control.DeepSeq Methods rnf :: Bool -> () | |
NFData Char | |
Defined in Control.DeepSeq Methods rnf :: Char -> () | |
NFData Double | |
Defined in Control.DeepSeq Methods rnf :: Double -> () | |
NFData Float | |
Defined in Control.DeepSeq Methods rnf :: Float -> () | |
NFData Int | |
Defined in Control.DeepSeq Methods rnf :: Int -> () | |
NFData Word | |
Defined in Control.DeepSeq Methods rnf :: Word -> () | |
NFData a => NFData (ZipList a) | |
Defined in Control.DeepSeq Methods rnf :: ZipList a -> () | |
NFData a => NFData (Complex a) | |
Defined in Control.DeepSeq Methods rnf :: Complex a -> () | |
NFData a => NFData (Identity a) | |
Defined in Control.DeepSeq Methods rnf :: Identity a -> () | |
NFData a => NFData (First a) | |
Defined in Control.DeepSeq Methods rnf :: First a -> () | |
NFData a => NFData (Last a) | |
Defined in Control.DeepSeq Methods rnf :: Last a -> () | |
NFData a => NFData (Down a) | |
Defined in Control.DeepSeq Methods rnf :: Down a -> () | |
NFData a => NFData (First a) | |
Defined in Control.DeepSeq Methods rnf :: First a -> () | |
NFData a => NFData (Last a) | |
Defined in Control.DeepSeq Methods rnf :: Last a -> () | |
NFData a => NFData (Max a) | |
Defined in Control.DeepSeq Methods rnf :: Max a -> () | |
NFData a => NFData (Min a) | |
Defined in Control.DeepSeq Methods rnf :: Min a -> () | |
NFData m => NFData (WrappedMonoid m) | |
Defined in Control.DeepSeq Methods rnf :: WrappedMonoid m -> () | |
NFData a => NFData (Dual a) | |
Defined in Control.DeepSeq Methods rnf :: Dual a -> () | |
NFData a => NFData (Product a) | |
Defined in Control.DeepSeq Methods rnf :: Product a -> () | |
NFData a => NFData (Sum a) | |
Defined in Control.DeepSeq Methods rnf :: Sum a -> () | |
NFData (IORef a) | |
Defined in Control.DeepSeq Methods rnf :: IORef a -> () | |
NFData (MVar a) | |
Defined in Control.DeepSeq Methods rnf :: MVar a -> () | |
NFData (FunPtr a) | |
Defined in Control.DeepSeq Methods rnf :: FunPtr a -> () | |
NFData (Ptr a) | |
Defined in Control.DeepSeq Methods rnf :: Ptr a -> () | |
NFData a => NFData (Ratio a) | |
Defined in Control.DeepSeq Methods rnf :: Ratio a -> () | |
NFData (StableName a) | |
Defined in Control.DeepSeq Methods rnf :: StableName a -> () | |
NFData a => NFData (NonEmpty a) | |
Defined in Control.DeepSeq Methods rnf :: NonEmpty a -> () | |
NFData a => NFData (Maybe a) | |
Defined in Control.DeepSeq Methods rnf :: Maybe a -> () | |
NFData a => NFData [a] | |
Defined in Control.DeepSeq Methods rnf :: [a] -> () | |
(NFData a, NFData b) => NFData (Either a b) | |
Defined in Control.DeepSeq Methods rnf :: Either a b -> () | |
NFData (Fixed a) | |
Defined in Control.DeepSeq Methods rnf :: Fixed a -> () | |
NFData (Proxy a) | |
Defined in Control.DeepSeq Methods rnf :: Proxy a -> () | |
(NFData a, NFData b) => NFData (Arg a b) | |
Defined in Control.DeepSeq Methods rnf :: Arg a b -> () | |
(NFData a, NFData b) => NFData (Array a b) | |
Defined in Control.DeepSeq Methods rnf :: Array a b -> () | |
NFData (STRef s a) | |
Defined in Control.DeepSeq Methods rnf :: STRef s a -> () | |
NFData (a -> b) | |
Defined in Control.DeepSeq Methods rnf :: (a -> b) -> () | |
(NFData a, NFData b) => NFData (a, b) | |
Defined in Control.DeepSeq Methods rnf :: (a, b) -> () | |
NFData a => NFData (Const a b) | |
Defined in Control.DeepSeq Methods rnf :: Const a b -> () | |
NFData (a :~: b) | |
Defined in Control.DeepSeq Methods rnf :: (a :~: b) -> () | |
(NFData a1, NFData a2, NFData a3) => NFData (a1, a2, a3) | |
Defined in Control.DeepSeq Methods rnf :: (a1, a2, a3) -> () | |
(NFData1 f, NFData1 g, NFData a) => NFData (Product f g a) | |
Defined in Control.DeepSeq Methods rnf :: Product f g a -> () | |
(NFData1 f, NFData1 g, NFData a) => NFData (Sum f g a) | |
Defined in Control.DeepSeq Methods rnf :: Sum f g a -> () | |
NFData (a :~~: b) | |
Defined in Control.DeepSeq Methods rnf :: (a :~~: b) -> () | |
(NFData a1, NFData a2, NFData a3, NFData a4) => NFData (a1, a2, a3, a4) | |
Defined in Control.DeepSeq Methods rnf :: (a1, a2, a3, a4) -> () | |
(NFData1 f, NFData1 g, NFData a) => NFData (Compose f g a) | |
Defined in Control.DeepSeq Methods rnf :: Compose f g a -> () | |
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) => NFData (a1, a2, a3, a4, a5) | |
Defined in Control.DeepSeq 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) | |
Defined in Control.DeepSeq 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) | |
Defined in Control.DeepSeq 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) | |
Defined in Control.DeepSeq 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) | |
Defined in Control.DeepSeq Methods rnf :: (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> () |