module Numeric.Probability.Example.Dice where
import qualified Numeric.Probability.Distribution as Dist
import Numeric.Probability.Distribution ((??), )
import Control.Monad (liftM2, replicateM)
type Die = Int
type Probability = Rational
type Dist = Dist.T Probability
die :: Dist Die
die = Dist.uniform [1..6]
twoDice :: Dist (Die,Die)
twoDice = liftM2 (,) die die
dice :: Int -> Dist [Die]
dice = flip replicateM die
twoSixes :: Probability
twoSixes = (==(6,6)) ?? twoDice
sixes :: (Int -> Bool) -> Int -> Probability
sixes p n = (p . length . filter (==6)) ?? dice n
droll :: Dist Die
droll =
liftM2 (+) (Dist.uniform [0,1]) die
g3 :: Probability
g3 = (>3) ?? die
addTwo :: Dist Die
addTwo =
liftM2 (+) die die