random-fu-0.0.3.2: src/Data/Random/Sample.hs
{-
- ``Data/Random/Sample''
-}
{-# LANGUAGE
MultiParamTypeClasses,
FlexibleInstances, FlexibleContexts,
IncoherentInstances
#-}
module Data.Random.Sample where
import Data.Random.Distribution
import Data.Random.Lift
import Data.Random.RVar
import Data.Random.Source
import Data.Random.Source.Std
-- |A typeclass allowing 'Distribution's and 'RVar's to be sampled. Both may
-- also be sampled via 'runRVar' or 'runRVarT', but I find it psychologically
-- pleasing to be able to sample both using this function.
class Sampleable d m t where
-- |Directly sample from a distribution or random variable, using the given source of entropy.
sampleFrom :: RandomSource m s => s -> d t -> m t
instance Distribution d t => Sampleable d m t where
sampleFrom src d = runRVarT (rvar d) src
-- This instance overlaps with the other, but because RVarT is not a Distribution there is no conflict.
instance Lift m n => Sampleable (RVarT m) n t where
sampleFrom src x = runRVarT x src
-- |Sample a distribution using the default source of entropy for the
-- monad in which the sampling occurs.
sample :: (Sampleable d m t, MonadRandom m) => d t -> m t
sample = sampleFrom StdRandom