Boys.hs
{- |
Consider a family of two children. Given that there is a boy in the family,
what is the probability that there are two boys in the family?
-}
module Boys where
import Probability
(Dist, Probability, Trans, Event,
uniform, just, mapD, sequ, (??), (|||))
data Child = Boy | Girl
deriving (Eq,Ord,Show)
type Family = [Child]
birth :: Trans Family
birth f = uniform [Boy:f,Girl:f]
family :: Dist Family
family = sequ [birth,birth] []
-- NOTE: could be fixed to 2
-- could be renamed to allBoys
--
boys :: Int -> Event Family
boys n = just (replicate n Boy)
existsBoy :: Event Family
existsBoy = elem Boy
-- NOTE: might not be needed, i.e., definition can be inlined instead
--
familyWithBoy :: Dist Family
familyWithBoy = family ||| existsBoy
twoBoys :: Probability
twoBoys = (boys 2) ?? familyWithBoy
countBoys :: Family -> Int
countBoys = length . filter (==Boy)
numBoys :: Dist Int
numBoys = mapD countBoys familyWithBoy