module Dice where import Probability (Dist, Probability, prod, uniform, (??)) import Monad (liftM2) type Die = Int die :: Dist Die die = uniform [1..6] twoDice :: Dist (Die,Die) twoDice = prod die die dice :: Int -> Dist [Die] dice n = sequence $ replicate n die -- dice = replicateM twoSixes :: Probability twoSixes = (==(6,6)) ?? liftM2 (,) die die {- | @sixes p n@ computes the probability of getting p sixes (@>1@, @==2@, ...) when rolling n dice -} sixes :: (Int -> Bool) -> Int -> Probability sixes p n = (p . length . filter (==6)) ?? dice n droll :: Dist Die droll = liftM2 (+) (uniform [0,1]) die g3 :: Probability g3 = (>3) ?? die addTwo :: Dist Die addTwo = liftM2 (+) die die