packages feed

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

{-# LANGUAGE QualifiedDo, RebindableSyntax #-}
-- | Random walks with imprecise step probability.
module Imp.Examples.Iteration
  ( walk1
  , walk2
  , walk3
  , walk3Asym
  ) where

import Imp

-- | 1-step walk.
walk1 :: Imp '["s1"] Int
walk1 = Imp.do
  steps <- intervalMap @'["s1"] 0.3 0.7
  Imp.return $ length (filter id steps)

-- | 2-step walk.
walk2 :: Imp '["s1", "s2"] Int
walk2 = Imp.do
  steps <- intervalMap @'["s1", "s2"] 0.3 0.7
  Imp.return $ length (filter id steps)

-- | 3-step walk.
walk3 :: Imp '["s1", "s2", "s3"] Int
walk3 = Imp.do
  steps <- intervalMap @'["s1", "s2", "s3"] 0.3 0.7
  Imp.return $ length (filter id steps)

-- | Asymmetric intervals break the swap-symmetry.
walk3Asym :: Imp '["s1", "s2", "s3"] Int
walk3Asym = Imp.do
  s1 <- interval @"s1" 0.1 0.9
  s2 <- interval @"s2" 0.3 0.7
  s3 <- interval @"s3" 0.45 0.55
  Imp.return $ length (filter id [s1, s2, s3])