packages feed

imp-ppl-0.1.0.0: src/Imp/Examples/Basic.hs

{-# LANGUAGE QualifiedDo, RebindableSyntax #-}
-- | Simple coin-flip programs with no Knightian uncertainty.
module Imp.Examples.Basic
  ( fairCoin
  , twoCoins
  , biasedCoin
  , coinOr
  ) where

import Imp

-- | Fair coin flip.
fairCoin :: Imp '[] Bool
fairCoin = flip 0.5

-- | Two independent coin flips.
twoCoins :: Imp '[] (Bool, Bool)
twoCoins = Imp.do
  a <- flip 0.5
  b <- flip 0.5
  Imp.return (a, b)

-- | Biased coin.
biasedCoin :: Imp '[] Bool
biasedCoin = flip 0.7

-- | OR of two fair coins.
coinOr :: Imp '[] Bool
coinOr = Imp.do
  a <- flip 0.5
  b <- flip 0.5
  Imp.return (a || b)