fused-effects-0.1.0.0: A fast, flexible, fused effect system.

Safe HaskellNone
LanguageHaskell2010

Control.Effect.Random

Synopsis

Documentation

data Random m k Source #

Constructors

Random a => Random (a -> k) 
Random a => RandomR (a, a) (a -> k) 
Interleave (m a) (a -> k) 
Instances
Effect Random Source # 
Instance details

Defined in Control.Effect.Random.Internal

Methods

handle :: Functor f => f () -> (forall x. f (m x) -> n (f x)) -> Random m (m a) -> Random n (n (f a)) Source #

HFunctor Random Source # 
Instance details

Defined in Control.Effect.Random.Internal

Methods

fmap' :: (a -> b) -> Random m a -> Random m b Source #

hmap :: (forall x. m x -> n x) -> Random m a -> Random n a Source #

Functor (Random m) Source # 
Instance details

Defined in Control.Effect.Random.Internal

Methods

fmap :: (a -> b) -> Random m a -> Random m b #

(<$) :: a -> Random m b -> Random m a #

(Carrier sig m, Effect sig, RandomGen g, Monad m) => Carrier (Random :+: sig) (RandomC g m) Source # 
Instance details

Defined in Control.Effect.Random

Methods

ret :: a -> RandomC g m a Source #

eff :: (Random :+: sig) (RandomC g m) (RandomC g m a) -> RandomC g m a Source #

runRandom :: (Carrier sig m, Effect sig, Monad m, RandomGen g) => g -> Eff (RandomC g m) a -> m (g, a) Source #

Run a random computation starting from a given generator.

run (runRandom (PureGen a) (pure b)) == (PureGen a, b)

evalRandom :: (Carrier sig m, Effect sig, Monad m, RandomGen g) => g -> Eff (RandomC g m) a -> m a Source #

Run a random computation starting from a given generator and discarding the final generator.

run (evalRandom (PureGen a) (pure b)) == b

execRandom :: (Carrier sig m, Effect sig, Monad m, RandomGen g) => g -> Eff (RandomC g m) a -> m g Source #

Run a random computation starting from a given generator and discarding the final result.

run (execRandom (PureGen a) (pure b)) == PureGen a

evalRandomIO :: (Carrier sig m, Effect sig, MonadIO m) => Eff (RandomC StdGen m) a -> m a Source #

Run a random computation in IO, splitting the global standard generator to get a new one for the computation.

newtype RandomC g m a Source #

Constructors

RandomC 

Fields

Instances
(Carrier sig m, Effect sig, RandomGen g, Monad m) => Carrier (Random :+: sig) (RandomC g m) Source # 
Instance details

Defined in Control.Effect.Random

Methods

ret :: a -> RandomC g m a Source #

eff :: (Random :+: sig) (RandomC g m) (RandomC g m a) -> RandomC g m a Source #

class Monad m => MonadRandom (m :: * -> *) where #

With a source of random number supply in hand, the MonadRandom class allows the programmer to extract random values of a variety of types.

Minimal complete definition

getRandomR, getRandom, getRandomRs, getRandoms

Methods

getRandomR :: Random a => (a, a) -> m a #

Takes a range (lo,hi) and a random number generator g, and returns a computation that returns a random value uniformly distributed in the closed interval [lo,hi], together with a new generator. It is unspecified what happens if lo>hi. For continuous types there is no requirement that the values lo and hi are ever produced, but they may be, depending on the implementation and the interval.

See randomR for details.

getRandom :: Random a => m a #

The same as getRandomR, but using a default range determined by the type:

  • For bounded types (instances of Bounded, such as Char), the range is normally the whole type.
  • For fractional types, the range is normally the semi-closed interval [0,1).
  • For Integer, the range is (arbitrarily) the range of Int.

See random for details.

getRandomRs :: Random a => (a, a) -> m [a] #

Plural variant of getRandomR, producing an infinite list of random values instead of returning a new generator.

See randomRs for details.

getRandoms :: Random a => m [a] #

Plural variant of getRandom, producing an infinite list of random values instead of returning a new generator.

See randoms for details.

Instances
MonadRandom IO 
Instance details

Defined in Control.Monad.Random.Class

Methods

getRandomR :: Random a => (a, a) -> IO a #

getRandom :: Random a => IO a #

getRandomRs :: Random a => (a, a) -> IO [a] #

getRandoms :: Random a => IO [a] #

MonadRandom m => MonadRandom (ListT m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

getRandomR :: Random a => (a, a) -> ListT m a #

getRandom :: Random a => ListT m a #

getRandomRs :: Random a => (a, a) -> ListT m [a] #

getRandoms :: Random a => ListT m [a] #

MonadRandom m => MonadRandom (MaybeT m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

getRandomR :: Random a => (a, a) -> MaybeT m a #

getRandom :: Random a => MaybeT m a #

getRandomRs :: Random a => (a, a) -> MaybeT m [a] #

getRandoms :: Random a => MaybeT m [a] #

(Member Random sig, Carrier sig carrier) => MonadRandom (Eff carrier) # 
Instance details

Defined in Control.Effect.Internal

Methods

getRandomR :: Random a => (a, a) -> Eff carrier a #

getRandom :: Random a => Eff carrier a #

getRandomRs :: Random a => (a, a) -> Eff carrier [a] #

getRandoms :: Random a => Eff carrier [a] #

MonadRandom m => MonadRandom (IdentityT m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

getRandomR :: Random a => (a, a) -> IdentityT m a #

getRandom :: Random a => IdentityT m a #

getRandomRs :: Random a => (a, a) -> IdentityT m [a] #

getRandoms :: Random a => IdentityT m [a] #

(Error e, MonadRandom m) => MonadRandom (ErrorT e m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

getRandomR :: Random a => (a, a) -> ErrorT e m a #

getRandom :: Random a => ErrorT e m a #

getRandomRs :: Random a => (a, a) -> ErrorT e m [a] #

getRandoms :: Random a => ErrorT e m [a] #

MonadRandom m => MonadRandom (ExceptT e m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

getRandomR :: Random a => (a, a) -> ExceptT e m a #

getRandom :: Random a => ExceptT e m a #

getRandomRs :: Random a => (a, a) -> ExceptT e m [a] #

getRandoms :: Random a => ExceptT e m [a] #

MonadRandom m => MonadRandom (StateT s m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

getRandomR :: Random a => (a, a) -> StateT s m a #

getRandom :: Random a => StateT s m a #

getRandomRs :: Random a => (a, a) -> StateT s m [a] #

getRandoms :: Random a => StateT s m [a] #

MonadRandom m => MonadRandom (StateT s m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

getRandomR :: Random a => (a, a) -> StateT s m a #

getRandom :: Random a => StateT s m a #

getRandomRs :: Random a => (a, a) -> StateT s m [a] #

getRandoms :: Random a => StateT s m [a] #

(MonadRandom m, Monoid w) => MonadRandom (WriterT w m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

getRandomR :: Random a => (a, a) -> WriterT w m a #

getRandom :: Random a => WriterT w m a #

getRandomRs :: Random a => (a, a) -> WriterT w m [a] #

getRandoms :: Random a => WriterT w m [a] #

(MonadRandom m, Monoid w) => MonadRandom (WriterT w m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

getRandomR :: Random a => (a, a) -> WriterT w m a #

getRandom :: Random a => WriterT w m a #

getRandomRs :: Random a => (a, a) -> WriterT w m [a] #

getRandoms :: Random a => WriterT w m [a] #

MonadRandom m => MonadRandom (ContT r m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

getRandomR :: Random a => (a, a) -> ContT r m a #

getRandom :: Random a => ContT r m a #

getRandomRs :: Random a => (a, a) -> ContT r m [a] #

getRandoms :: Random a => ContT r m [a] #

MonadRandom m => MonadRandom (ReaderT r m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

getRandomR :: Random a => (a, a) -> ReaderT r m a #

getRandom :: Random a => ReaderT r m a #

getRandomRs :: Random a => (a, a) -> ReaderT r m [a] #

getRandoms :: Random a => ReaderT r m [a] #

(Monoid w, MonadRandom m) => MonadRandom (RWST r w s m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

getRandomR :: Random a => (a, a) -> RWST r w s m a #

getRandom :: Random a => RWST r w s m a #

getRandomRs :: Random a => (a, a) -> RWST r w s m [a] #

getRandoms :: Random a => RWST r w s m [a] #

(Monoid w, MonadRandom m) => MonadRandom (RWST r w s m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

getRandomR :: Random a => (a, a) -> RWST r w s m a #

getRandom :: Random a => RWST r w s m a #

getRandomRs :: Random a => (a, a) -> RWST r w s m [a] #

getRandoms :: Random a => RWST r w s m [a] #

class MonadRandom m => MonadInterleave (m :: * -> *) where #

The class MonadInterleave proivides a convenient interface atop a split operation on a random generator.

Minimal complete definition

interleave

Methods

interleave :: m a -> m a #

If x :: m a is a computation in some random monad, then interleave x works by splitting the generator, running x using one half, and using the other half as the final generator state of interleave x (replacing whatever the final generator state otherwise would have been). This means that computation needing random values which comes after interleave x does not necessarily depend on the computation of x. For example:

>>> evalRandIO $ snd <$> ((,) <$> undefined <*> getRandom)
*** Exception: Prelude.undefined
>>> evalRandIO $ snd <$> ((,) <$> interleave undefined <*> getRandom)
6192322188769041625

This can be used, for example, to allow random computations to run in parallel, or to create lazy infinite structures of random values. In the example below, the infinite tree randTree cannot be evaluated lazily: even though it is cut off at two levels deep by hew 2, the random value in the right subtree still depends on generation of all the random values in the (infinite) left subtree, even though they are ultimately unneeded. Inserting a call to interleave, as in randTreeI, solves the problem: the generator splits at each Node, so random values in the left and right subtrees are generated independently.

data Tree = Leaf | Node Int Tree Tree deriving Show

hew :: Int -> Tree -> Tree
hew 0 _    = Leaf
hew _ Leaf = Leaf
hew n (Node x l r) = Node x (hew (n-1) l) (hew (n-1) r)

randTree :: Rand StdGen Tree
randTree = Node <$> getRandom <*> randTree <*> randTree

randTreeI :: Rand StdGen Tree
randTreeI = interleave $ Node <$> getRandom <*> randTreeI <*> randTreeI
>>> hew 2 <$> evalRandIO randTree
Node 2168685089479838995 (Node (-1040559818952481847) Leaf Leaf) (Node ^CInterrupted.
>>> hew 2 <$> evalRandIO randTreeI
Node 8243316398511136358 (Node 4139784028141790719 Leaf Leaf) (Node 4473998613878251948 Leaf Leaf)
Instances
MonadInterleave m => MonadInterleave (ListT m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

interleave :: ListT m a -> ListT m a #

MonadInterleave m => MonadInterleave (MaybeT m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

interleave :: MaybeT m a -> MaybeT m a #

(Member Random sig, Carrier sig carrier) => MonadInterleave (Eff carrier) # 
Instance details

Defined in Control.Effect.Internal

Methods

interleave :: Eff carrier a -> Eff carrier a #

MonadInterleave m => MonadInterleave (IdentityT m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

interleave :: IdentityT m a -> IdentityT m a #

(Error e, MonadInterleave m) => MonadInterleave (ErrorT e m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

interleave :: ErrorT e m a -> ErrorT e m a #

MonadInterleave m => MonadInterleave (ExceptT e m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

interleave :: ExceptT e m a -> ExceptT e m a #

MonadInterleave m => MonadInterleave (StateT s m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

interleave :: StateT s m a -> StateT s m a #

MonadInterleave m => MonadInterleave (StateT s m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

interleave :: StateT s m a -> StateT s m a #

(Monoid w, MonadInterleave m) => MonadInterleave (WriterT w m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

interleave :: WriterT w m a -> WriterT w m a #

(Monoid w, MonadInterleave m) => MonadInterleave (WriterT w m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

interleave :: WriterT w m a -> WriterT w m a #

MonadInterleave m => MonadInterleave (ContT r m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

interleave :: ContT r m a -> ContT r m a #

MonadInterleave m => MonadInterleave (ReaderT r m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

interleave :: ReaderT r m a -> ReaderT r m a #

(Monoid w, MonadInterleave m) => MonadInterleave (RWST r w s m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

interleave :: RWST r w s m a -> RWST r w s m a #

(Monoid w, MonadInterleave m) => MonadInterleave (RWST r w s m) 
Instance details

Defined in Control.Monad.Random.Class

Methods

interleave :: RWST r w s m a -> RWST r w s m a #