Copyright | (c) Brent Yorgey 2016 |
---|---|
License | BSD3 (see LICENSE) |
Maintainer | byorgey@gmail.com |
Stability | experimental |
Portability | non-portable (multi-param classes, functional dependencies, undecidable instances) |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
Strict random monads, passing a random number generator through a computation. See below for examples.
In this version, sequencing of computations is strict (but computations are not strict in the state unless you force it with seq or the like). For a lazy version with the same interface, see Control.Monad.Trans.Random.Lazy.
- type Rand g = RandT g Identity
- liftRand :: (g -> (a, g)) -> Rand g a
- runRand :: Rand g a -> g -> (a, g)
- evalRand :: Rand g a -> g -> a
- execRand :: Rand g a -> g -> g
- mapRand :: ((a, g) -> (b, g)) -> Rand g a -> Rand g b
- withRand :: (g -> g) -> Rand g a -> Rand g a
- evalRandIO :: Rand StdGen a -> IO a
- data RandT g m a
- liftRandT :: (g -> m (a, g)) -> RandT g m a
- runRandT :: RandT g m a -> g -> m (a, g)
- evalRandT :: Monad m => RandT g m a -> g -> m a
- execRandT :: Monad m => RandT g m a -> g -> m g
- mapRandT :: (m (a, g) -> n (b, g)) -> RandT g m a -> RandT g n b
- withRandT :: (g -> g) -> RandT g m a -> RandT g m a
- evalRandTIO :: MonadIO m => RandT StdGen m a -> m a
- liftCallCC :: CallCC m (a, g) (b, g) -> CallCC (RandT g m) a b
- liftCallCC' :: CallCC m (a, g) (b, g) -> CallCC (RandT g m) a b
- liftCatch :: Catch e m (a, g) -> Catch e (RandT g m) a
- liftListen :: Monad m => Listen w m (a, g) -> Listen w (RandT g m) a
- liftPass :: Monad m => Pass w m (a, g) -> Pass w (RandT g m) a
The Rand monad transformer
:: (g -> (a, g)) | pure random transformer |
-> Rand g a | equivalent generator-passing computation |
Construct a random monad computation from a function.
(The inverse of runRand
.)
:: Rand g a | generator-passing computation to execute |
-> g | initial generator |
-> (a, g) | return value and final generator |
Unwrap a random monad computation as a function.
(The inverse of liftRand
.)
:: Rand g a | generator-passing computation to execute |
-> g | initial generator |
-> a | return value of the random computation |
:: Rand g a | generator-passing computation to execute |
-> g | initial generator |
-> g | final generator |
evalRandIO :: Rand StdGen a -> IO a Source #
Evaluate a random computation in the IO
monad, splitting the global
standard generator to get a new one for the computation.
The RandT monad transformer
A random transformer monad parameterized by:
g
- The generator.m
- The inner monad.
The return
function leaves the generator unchanged, while >>=
uses the
final generator of the first computation as the initial generator of the
second.
(MonadReader r m, MonadWriter w m, MonadState s m) => MonadRWS r w s (RandT g m) Source # | |
MonadWriter w m => MonadWriter w (RandT g m) Source # | |
MonadState s m => MonadState s (RandT g m) Source # | |
MonadReader r m => MonadReader r (RandT g m) Source # | |
MonadError e m => MonadError e (RandT g m) Source # | |
(RandomGen g, Monad m) => MonadSplit g (RandT g m) Source # | |
MonadTrans (RandT g) Source # | |
Monad m => Monad (RandT g m) Source # | |
Functor m => Functor (RandT g m) Source # | |
MonadFix m => MonadFix (RandT g m) Source # | |
MonadFail m => MonadFail (RandT g m) Source # | |
Monad m => Applicative (RandT g m) Source # | |
MonadIO m => MonadIO (RandT g m) Source # | |
MonadPlus m => Alternative (RandT g m) Source # | |
MonadPlus m => MonadPlus (RandT g m) Source # | |
MonadCont m => MonadCont (RandT g m) Source # | |
PrimMonad m => PrimMonad (RandT s m) Source # | |
(Monad m, RandomGen g) => MonadInterleave (RandT g m) Source # | |
(RandomGen g, Monad m) => MonadRandom (RandT g m) Source # | |
type PrimState (RandT s m) Source # | |
:: (g -> m (a, g)) | impure random transformer |
-> RandT g m a | equivalent generator-passing computation |
Construct a random monad computation from an impure function.
(The inverse of runRandT
.)
:: RandT g m a | generator-passing computation to execute |
-> g | initial generator |
-> m (a, g) | return value and final generator |
Unwrap a random monad computation as an impure function.
(The inverse of liftRandT
.)
evalRandTIO :: MonadIO m => RandT StdGen m a -> m a Source #
Evaluate a random computation that is embedded in the IO
monad,
splitting the global standard generator to get a new one for the
computation.
Lifting other operations
liftCallCC :: CallCC m (a, g) (b, g) -> CallCC (RandT g m) a b Source #
Uniform lifting of a callCC
operation to the new monad.
This version rolls back to the original state on entering the
continuation.
liftCallCC' :: CallCC m (a, g) (b, g) -> CallCC (RandT g m) a b Source #
In-situ lifting of a callCC
operation to the new monad.
This version uses the current state on entering the continuation.
It does not satisfy the uniformity property (see Control.Monad.Signatures).
liftCatch :: Catch e m (a, g) -> Catch e (RandT g m) a Source #
Lift a catchE
operation to the new monad.
liftListen :: Monad m => Listen w m (a, g) -> Listen w (RandT g m) a Source #
Lift a listen
operation to the new monad.
liftPass :: Monad m => Pass w m (a, g) -> Pass w (RandT g m) a Source #
Lift a pass
operation to the new monad.
Examples
Random monads
The die
function simulates the roll of a die, picking a number between 1
and 6, inclusive, and returning it in the Rand
monad transformer. Notice
that this code will work with any random number generator g
.
die :: (RandomGen g) => Rand g Int die = getRandomR (1, 6)
The dice
function uses replicate
and sequence
to simulate the roll of
n
dice.
dice :: (RandomGen g) => Int -> Rand g [Int] dice n = sequence (replicate n die)
To extract a value from the Rand
monad transformer, we can use evalRandIO
.
main = do values <- evalRandIO (dice 2) putStrLn (show values)