module Data.Random.Distribution.Beta where
import Data.Random.RVar
import Data.Random.Distribution
import Data.Random.Distribution.Gamma
import Data.Random.Distribution.Uniform
import Control.Monad
fractionalBeta :: (Fractional a, Distribution Gamma a, Distribution StdUniform a) => a -> a -> RVar a
fractionalBeta 1 1 = stdUniform
fractionalBeta a b = do
x <- gamma a 1
y <- gamma b 1
return (x / (x + y))
fractionalBetaFromIntegral :: (Fractional c, Distribution (Erlang a) c, Distribution (Erlang b) c) => a -> b -> RVar c
fractionalBetaFromIntegral a b = do
x <- erlang a
y <- erlang b
return (x / (x + y))
beta :: Distribution Beta a => a -> a -> RVar a
beta a b = rvar (Beta a b)
data Beta a = Beta a a
instance (Fractional a, Distribution Gamma a, Distribution StdUniform a) => Distribution Beta a where
rvar (Beta a b) = fractionalBeta a b