packages feed

safe-coupling-0.1.0.0: src/ApplicativeBins/Bins.hs

{-@ LIQUID "--reflection"     @-}

module ApplicativeBins.Bins where

import           Monad.PrM
import           Data.Dist

{-@ type PDouble = {v:Double | 0 <= v } @-}

{-@ reflect bins @-}
{-@ bins :: p:Prob -> n:PDouble -> PrM {d:Double | 0 <= d && d <= n } / [n] @-}
bins :: Double -> Double -> PrM Double
bins _ n | n < 1.0 = ppure 0
bins p n = liftA2 plus (bins p (n - 1)) (bernoulli p)

{-@ reflect plus @-}
{-@ plus :: x:Double -> y:Double -> {d:Double | d = x + y } @-} 
plus :: Double -> Double -> Double 
plus x y = x + y