module Numeric.Probability.Example.NBoys where
import qualified Numeric.Probability.Distribution as Dist
import Numeric.Probability.Distribution (Event, (??), (?=<<), )
import Numeric.Probability.Example.Boys
(Dist, Probability, Child(Boy), birth, )
import Control.Monad (replicateM)
type Family = [Child]
family :: Int -> Dist Family
family :: Int -> Dist Family
family Int
n = forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
n Dist Child
birth
countBoys :: Family -> Int
countBoys :: Family -> Int
countBoys = forall (t :: * -> *) a. Foldable t => t a -> Int
length forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter (forall a. Eq a => a -> a -> Bool
==Child
Boy)
boys :: Int -> Event Family
boys :: Int -> Event Family
boys Int
k Family
f = Family -> Int
countBoys Family
f forall a. Ord a => a -> a -> Bool
>= Int
k
nBoys :: Int -> Int -> Int -> Probability
nBoys :: Int -> Int -> Int -> Probability
nBoys Int
n Int
k Int
m = Int -> Event Family
boys Int
m forall prob a. Num prob => Event a -> T prob a -> prob
?? Int -> Event Family
boys Int
k forall prob a.
Fractional prob =>
(a -> Bool) -> T prob a -> T prob a
?=<< Int -> Dist Family
family Int
n
numBoys :: Int -> Int -> Dist Int
numBoys :: Int -> Int -> Dist Int
numBoys Int
n Int
k = forall prob b a.
(Num prob, Ord b) =>
(a -> b) -> T prob a -> T prob b
Dist.map Family -> Int
countBoys (Int -> Event Family
boys Int
k forall prob a.
Fractional prob =>
(a -> Bool) -> T prob a -> T prob a
?=<< Int -> Dist Family
family Int
n)
onlyBoys1 :: Int -> Probability
onlyBoys1 :: Int -> Probability
onlyBoys1 Int
n = Int -> Int -> Int -> Probability
nBoys Int
n Int
1 Int
n