module Data.Random.Distribution.Exponential where
import Data.Random.Source
import Data.Random.RVar
import Data.Random.Distribution
import Data.Random.Distribution.Uniform
data Exponential a = Exp a
floatingExponential :: (Floating a, Distribution StdUniform a) => a -> RVar a
floatingExponential lambdaRecip = do
x <- stdUniform
return (negate (log x) * lambdaRecip)
exponential :: Distribution Exponential a => a -> RVar a
exponential = rvar . Exp
instance (Floating a, Distribution StdUniform a) => Distribution Exponential a where
rvar (Exp lambdaRecip) = floatingExponential lambdaRecip