This module provides functions useful for implementing new MonadRandom
and RandomSource
instances for state-abstractions containing StdGen
values (the pure pseudorandom generator provided by the System.Random
module in the "random" package), as well as instances for some common
cases.
- getRandomByteFromStdGenIO :: IO Word8
- getRandomWordFromStdGenIO :: IO Word64
- getRandomDoubleFromStdGenIO :: IO Double
- getRandomByteFromRandomGenRef :: (Monad m, ModifyRef sr m g, RandomGen g) => sr -> m Word8
- getRandomWordFromRandomGenRef :: (Monad m, ModifyRef sr m g, RandomGen g) => sr -> m Word64
- getRandomDoubleFromRandomGenRef :: (Monad m, ModifyRef sr m g, RandomGen g) => sr -> m Double
- getRandomByteFromRandomGenState :: (RandomGen g, MonadState g m) => m Word8
- getRandomWordFromRandomGenState :: (RandomGen g, MonadState g m) => m Word64
- getRandomDoubleFromRandomGenState :: (RandomGen g, MonadState g m) => m Double
Documentation
getRandomByteFromRandomGenRef :: (Monad m, ModifyRef sr m g, RandomGen g) => sr -> m Word8Source
Given a mutable reference to a RandomGen
generator, we can make a
RandomSource
usable in any monad in which the reference can be modified.
For example, if x :: TVar StdGen
, getRandomByteFromRandomGenRef x
can be
used as a RandomSource
in IO
, STM
, or any monad which is an instance
of MonadIO
. It's generally probably better to use
getRandomWordFromRandomGenRef
though, as this one is likely to throw
away a lot of perfectly good entropy. Better still is to use these 3 functions
together to create a RandomSource
instance for the reference you're using,
if one does not already exist.
getRandomByteFromRandomGenState :: (RandomGen g, MonadState g m) => m Word8Source
Similarly, getRandomWordFromRandomGenState x
can be used in any "state"
monad in the mtl sense whose state is a RandomGen
generator.
Additionally, the standard mtl state monads have MonadRandom
instances
which do precisely that, allowing an easy conversion of RVar
s and
other Distribution
instances to "pure" random variables.
getRandomWordFromRandomGenState :: (RandomGen g, MonadState g m) => m Word64Source
getRandomDoubleFromRandomGenState :: (RandomGen g, MonadState g m) => m DoubleSource