{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-redundant-constraints #-}
module Circuit.Prob
(
Prob (..),
embed,
fromWeighted,
score,
mass,
copyP,
discardP,
choiceBy,
orP,
parFG,
parGF,
traceE,
traceEN,
Semiring (..),
Tropical (..),
)
where
import Circuit.Category (Category (..))
import Circuit.Channel (Channel (..), Strength (..))
import Circuit.Tensor (Unit, Unital (..))
import Data.Bifunctor (second)
import Prelude hiding (id, (.))
import Prelude qualified
class Semiring r where
sAdd :: r -> r -> r
sMul :: r -> r -> r
sZero :: r
sOne :: r
newtype Tropical = Tropical {Tropical -> Double
getTropical :: Double}
deriving (Tropical -> Tropical -> Bool
(Tropical -> Tropical -> Bool)
-> (Tropical -> Tropical -> Bool) -> Eq Tropical
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Tropical -> Tropical -> Bool
== :: Tropical -> Tropical -> Bool
$c/= :: Tropical -> Tropical -> Bool
/= :: Tropical -> Tropical -> Bool
Eq, Eq Tropical
Eq Tropical =>
(Tropical -> Tropical -> Ordering)
-> (Tropical -> Tropical -> Bool)
-> (Tropical -> Tropical -> Bool)
-> (Tropical -> Tropical -> Bool)
-> (Tropical -> Tropical -> Bool)
-> (Tropical -> Tropical -> Tropical)
-> (Tropical -> Tropical -> Tropical)
-> Ord Tropical
Tropical -> Tropical -> Bool
Tropical -> Tropical -> Ordering
Tropical -> Tropical -> Tropical
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Tropical -> Tropical -> Ordering
compare :: Tropical -> Tropical -> Ordering
$c< :: Tropical -> Tropical -> Bool
< :: Tropical -> Tropical -> Bool
$c<= :: Tropical -> Tropical -> Bool
<= :: Tropical -> Tropical -> Bool
$c> :: Tropical -> Tropical -> Bool
> :: Tropical -> Tropical -> Bool
$c>= :: Tropical -> Tropical -> Bool
>= :: Tropical -> Tropical -> Bool
$cmax :: Tropical -> Tropical -> Tropical
max :: Tropical -> Tropical -> Tropical
$cmin :: Tropical -> Tropical -> Tropical
min :: Tropical -> Tropical -> Tropical
Ord, Int -> Tropical -> ShowS
[Tropical] -> ShowS
Tropical -> String
(Int -> Tropical -> ShowS)
-> (Tropical -> String) -> ([Tropical] -> ShowS) -> Show Tropical
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Tropical -> ShowS
showsPrec :: Int -> Tropical -> ShowS
$cshow :: Tropical -> String
show :: Tropical -> String
$cshowList :: [Tropical] -> ShowS
showList :: [Tropical] -> ShowS
Show)
instance Semiring Tropical where
sAdd :: Tropical -> Tropical -> Tropical
sAdd (Tropical Double
a) (Tropical Double
b) = Double -> Tropical
Tropical (Double -> Double -> Double
forall a. Ord a => a -> a -> a
Prelude.min Double
a Double
b)
sMul :: Tropical -> Tropical -> Tropical
sMul (Tropical Double
a) (Tropical Double
b) = Double -> Tropical
Tropical (Double
a Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
b)
sZero :: Tropical
sZero = Double -> Tropical
Tropical (Double
1 Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
0)
sOne :: Tropical
sOne = Double -> Tropical
Tropical Double
0
instance Semiring Double where
sAdd :: Double -> Double -> Double
sAdd = Double -> Double -> Double
forall a. Num a => a -> a -> a
(+)
sMul :: Double -> Double -> Double
sMul = Double -> Double -> Double
forall a. Num a => a -> a -> a
(*)
sZero :: Double
sZero = Double
0
sOne :: Double
sOne = Double
1
instance Semiring Bool where
sAdd :: Bool -> Bool -> Bool
sAdd = Bool -> Bool -> Bool
(||)
sMul :: Bool -> Bool -> Bool
sMul = Bool -> Bool -> Bool
(&&)
sZero :: Bool
sZero = Bool
False
sOne :: Bool
sOne = Bool
True
newtype Prob arr r a b = Prob
{ forall {k} (arr :: * -> k -> *) (r :: k) a b.
Prob arr r a b -> forall x. arr (x, b) r -> arr (x, a) r
runProb :: forall x. arr (x, b) r -> arr (x, a) r
}
instance (Category arr) => Category (Prob arr r) where
id :: Prob arr r a a
id :: forall a. Prob arr r a a
id = (forall x. arr (x, a) r -> arr (x, a) r) -> Prob arr r a a
forall {k} (arr :: * -> k -> *) (r :: k) a b.
(forall x. arr (x, b) r -> arr (x, a) r) -> Prob arr r a b
Prob arr (x, a) r -> arr (x, a) r
forall a. a -> a
forall x. arr (x, a) r -> arr (x, a) r
Prelude.id
{-# INLINE id #-}
(.) ::
Prob arr r b c ->
Prob arr r a b ->
Prob arr r a c
Prob forall x. arr (x, c) r -> arr (x, b) r
f . :: forall b c a. Prob arr r b c -> Prob arr r a b -> Prob arr r a c
. Prob forall x. arr (x, b) r -> arr (x, a) r
g = (forall x. arr (x, c) r -> arr (x, a) r) -> Prob arr r a c
forall {k} (arr :: * -> k -> *) (r :: k) a b.
(forall x. arr (x, b) r -> arr (x, a) r) -> Prob arr r a b
Prob ((forall x. arr (x, c) r -> arr (x, a) r) -> Prob arr r a c)
-> (forall x. arr (x, c) r -> arr (x, a) r) -> Prob arr r a c
forall a b. (a -> b) -> a -> b
$ \arr (x, c) r
k -> arr (x, b) r -> arr (x, a) r
forall x. arr (x, b) r -> arr (x, a) r
g (arr (x, c) r -> arr (x, b) r
forall x. arr (x, c) r -> arr (x, b) r
f arr (x, c) r
k)
{-# INLINE (.) #-}
embed :: (a -> b) -> Prob (->) r a b
embed :: forall a b r. (a -> b) -> Prob (->) r a b
embed a -> b
h = (forall x. ((x, b) -> r) -> (x, a) -> r) -> Prob (->) r a b
forall {k} (arr :: * -> k -> *) (r :: k) a b.
(forall x. arr (x, b) r -> arr (x, a) r) -> Prob arr r a b
Prob ((forall x. ((x, b) -> r) -> (x, a) -> r) -> Prob (->) r a b)
-> (forall x. ((x, b) -> r) -> (x, a) -> r) -> Prob (->) r a b
forall a b. (a -> b) -> a -> b
$ \(x, b) -> r
k -> (x, b) -> r
k ((x, b) -> r) -> ((x, a) -> (x, b)) -> (x, a) -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. (a -> b) -> (x, a) -> (x, b)
forall b c a. (b -> c) -> (a, b) -> (a, c)
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second a -> b
h
{-# INLINE embed #-}
fromWeighted :: (Semiring r) => [(b, r)] -> Prob (->) r () b
fromWeighted :: forall r b. Semiring r => [(b, r)] -> Prob (->) r () b
fromWeighted [(b, r)]
xs = (forall x. ((x, b) -> r) -> (x, ()) -> r) -> Prob (->) r () b
forall {k} (arr :: * -> k -> *) (r :: k) a b.
(forall x. arr (x, b) r -> arr (x, a) r) -> Prob arr r a b
Prob ((forall x. ((x, b) -> r) -> (x, ()) -> r) -> Prob (->) r () b)
-> (forall x. ((x, b) -> r) -> (x, ()) -> r) -> Prob (->) r () b
forall a b. (a -> b) -> a -> b
$ \(x, b) -> r
k (x
x, ()) -> (r -> r -> r) -> r -> [r] -> r
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr r -> r -> r
forall r. Semiring r => r -> r -> r
sAdd r
forall r. Semiring r => r
sZero [r -> r -> r
forall r. Semiring r => r -> r -> r
sMul r
w ((x, b) -> r
k (x
x, b
b)) | (b
b, r
w) <- [(b, r)]
xs]
{-# INLINE fromWeighted #-}
score :: (r -> r) -> Prob (->) r a a
score :: forall r a. (r -> r) -> Prob (->) r a a
score r -> r
scale = (forall x. ((x, a) -> r) -> (x, a) -> r) -> Prob (->) r a a
forall {k} (arr :: * -> k -> *) (r :: k) a b.
(forall x. arr (x, b) r -> arr (x, a) r) -> Prob arr r a b
Prob ((forall x. ((x, a) -> r) -> (x, a) -> r) -> Prob (->) r a a)
-> (forall x. ((x, a) -> r) -> (x, a) -> r) -> Prob (->) r a a
forall a b. (a -> b) -> a -> b
$ \(x, a) -> r
k (x
x, a
a) -> r -> r
scale ((x, a) -> r
k (x
x, a
a))
{-# INLINE score #-}
mass :: (Semiring r) => Prob (->) r a b -> a -> r
mass :: forall r a b. Semiring r => Prob (->) r a b -> a -> r
mass (Prob forall x. ((x, b) -> r) -> (x, a) -> r
f) a
a = (((), b) -> r) -> ((), a) -> r
forall x. ((x, b) -> r) -> (x, a) -> r
f (r -> ((), b) -> r
forall a b. a -> b -> a
const r
forall r. Semiring r => r
sOne) ((), a
a)
{-# INLINE mass #-}
copyP :: Prob (->) r a (a, a)
copyP :: forall r a. Prob (->) r a (a, a)
copyP = (a -> (a, a)) -> Prob (->) r a (a, a)
forall a b r. (a -> b) -> Prob (->) r a b
embed (\a
a -> (a
a, a
a))
{-# INLINE copyP #-}
discardP :: Prob (->) r a ()
discardP :: forall r a. Prob (->) r a ()
discardP = (a -> ()) -> Prob (->) r a ()
forall a b r. (a -> b) -> Prob (->) r a b
embed (() -> a -> ()
forall a b. a -> b -> a
const ())
{-# INLINE discardP #-}
choiceBy :: (r -> r -> r) -> Prob (->) r a b -> Prob (->) r a b -> Prob (->) r a b
choiceBy :: forall r a b.
(r -> r -> r)
-> Prob (->) r a b -> Prob (->) r a b -> Prob (->) r a b
choiceBy r -> r -> r
(<+>) (Prob forall x. ((x, b) -> r) -> (x, a) -> r
f) (Prob forall x. ((x, b) -> r) -> (x, a) -> r
g) = (forall x. ((x, b) -> r) -> (x, a) -> r) -> Prob (->) r a b
forall {k} (arr :: * -> k -> *) (r :: k) a b.
(forall x. arr (x, b) r -> arr (x, a) r) -> Prob arr r a b
Prob ((forall x. ((x, b) -> r) -> (x, a) -> r) -> Prob (->) r a b)
-> (forall x. ((x, b) -> r) -> (x, a) -> r) -> Prob (->) r a b
forall a b. (a -> b) -> a -> b
$ \(x, b) -> r
k (x, a)
p -> ((x, b) -> r) -> (x, a) -> r
forall x. ((x, b) -> r) -> (x, a) -> r
f (x, b) -> r
k (x, a)
p r -> r -> r
<+> ((x, b) -> r) -> (x, a) -> r
forall x. ((x, b) -> r) -> (x, a) -> r
g (x, b) -> r
k (x, a)
p
{-# INLINE choiceBy #-}
orP :: Prob (->) Bool a b -> Prob (->) Bool a b -> Prob (->) Bool a b
orP :: forall a b.
Prob (->) Bool a b -> Prob (->) Bool a b -> Prob (->) Bool a b
orP = (Bool -> Bool -> Bool)
-> Prob (->) Bool a b -> Prob (->) Bool a b -> Prob (->) Bool a b
forall r a b.
(r -> r -> r)
-> Prob (->) r a b -> Prob (->) r a b -> Prob (->) r a b
choiceBy Bool -> Bool -> Bool
(||)
{-# INLINE orP #-}
instance Channel (,) (Prob (->) r) where
assoc :: forall a b c. Prob (->) r ((a, b), c) (a, (b, c))
assoc = (((a, b), c) -> (a, (b, c))) -> Prob (->) r ((a, b), c) (a, (b, c))
forall a b r. (a -> b) -> Prob (->) r a b
embed ((a, b), c) -> (a, (b, c))
forall a b c. ((a, b), c) -> (a, (b, c))
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k).
Channel t arr =>
arr (t (t a b) c) (t a (t b c))
assoc
{-# INLINE assoc #-}
assoc' :: forall a b c. Prob (->) r (a, (b, c)) ((a, b), c)
assoc' = ((a, (b, c)) -> ((a, b), c)) -> Prob (->) r (a, (b, c)) ((a, b), c)
forall a b r. (a -> b) -> Prob (->) r a b
embed (a, (b, c)) -> ((a, b), c)
forall a b c. (a, (b, c)) -> ((a, b), c)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k).
Channel t arr =>
arr (t a (t b c)) (t (t a b) c)
assoc'
{-# INLINE assoc' #-}
slide :: forall a b c. Prob (->) r (a, (b, c)) (b, (a, c))
slide = ((a, (b, c)) -> (b, (a, c))) -> Prob (->) r (a, (b, c)) (b, (a, c))
forall a b r. (a -> b) -> Prob (->) r a b
embed (a, (b, c)) -> (b, (a, c))
forall a b c. (a, (b, c)) -> (b, (a, c))
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k).
Channel t arr =>
arr (t a (t b c)) (t b (t a c))
slide
{-# INLINE slide #-}
instance Strength (,) (Prob (->) r) where
strength :: forall b c a. Prob (->) r b c -> Prob (->) r (a, b) (a, c)
strength (Prob forall x. ((x, c) -> r) -> (x, b) -> r
f) = (forall x. ((x, (a, c)) -> r) -> (x, (a, b)) -> r)
-> Prob (->) r (a, b) (a, c)
forall {k} (arr :: * -> k -> *) (r :: k) a b.
(forall x. arr (x, b) r -> arr (x, a) r) -> Prob arr r a b
Prob ((forall x. ((x, (a, c)) -> r) -> (x, (a, b)) -> r)
-> Prob (->) r (a, b) (a, c))
-> (forall x. ((x, (a, c)) -> r) -> (x, (a, b)) -> r)
-> Prob (->) r (a, b) (a, c)
forall a b. (a -> b) -> a -> b
$ \(x, (a, c)) -> r
k -> (((x, a), c) -> r) -> ((x, a), b) -> r
forall x. ((x, c) -> r) -> (x, b) -> r
f ((x, (a, c)) -> r
k ((x, (a, c)) -> r)
-> (((x, a), c) -> (x, (a, c))) -> ((x, a), c) -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. ((x, a), c) -> (x, (a, c))
forall a b c. ((a, b), c) -> (a, (b, c))
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k).
Channel t arr =>
arr (t (t a b) c) (t a (t b c))
assoc) (((x, a), b) -> r)
-> ((x, (a, b)) -> ((x, a), b)) -> (x, (a, b)) -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. (x, (a, b)) -> ((x, a), b)
forall a b c. (a, (b, c)) -> ((a, b), c)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k).
Channel t arr =>
arr (t a (t b c)) (t (t a b) c)
assoc'
{-# INLINE strength #-}
instance Unital (,) (Prob (->) r) where
unitl :: forall a. Prob (->) r (Unit (,), a) a
unitl = (((), a) -> a) -> Prob (->) r ((), a) a
forall a b r. (a -> b) -> Prob (->) r a b
embed ((), a) -> a
(Unit (,), a) -> a
forall a. (Unit (,), a) -> a
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k).
Unital t arr =>
arr (t (Unit t) a) a
unitl
{-# INLINE unitl #-}
unitl' :: forall a. Prob (->) r a (Unit (,), a)
unitl' = (a -> ((), a)) -> Prob (->) r a ((), a)
forall a b r. (a -> b) -> Prob (->) r a b
embed a -> ((), a)
a -> (Unit (,), a)
forall a. a -> (Unit (,), a)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k).
Unital t arr =>
arr a (t (Unit t) a)
unitl'
{-# INLINE unitl' #-}
unitr :: forall a. Prob (->) r (a, Unit (,)) a
unitr = ((a, ()) -> a) -> Prob (->) r (a, ()) a
forall a b r. (a -> b) -> Prob (->) r a b
embed (a, ()) -> a
(a, Unit (,)) -> a
forall a. (a, Unit (,)) -> a
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k).
Unital t arr =>
arr (t a (Unit t)) a
unitr
{-# INLINE unitr #-}
unitr' :: forall a. Prob (->) r a (a, Unit (,))
unitr' = (a -> (a, ())) -> Prob (->) r a (a, ())
forall a b r. (a -> b) -> Prob (->) r a b
embed a -> (a, ())
a -> (a, Unit (,))
forall a. a -> (a, Unit (,))
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k).
Unital t arr =>
arr a (t a (Unit t))
unitr'
{-# INLINE unitr' #-}
parFG ::
Prob (->) r a b ->
Prob (->) r c d ->
Prob (->) r (a, c) (b, d)
parFG :: forall r a b c d.
Prob (->) r a b -> Prob (->) r c d -> Prob (->) r (a, c) (b, d)
parFG (Prob forall x. ((x, b) -> r) -> (x, a) -> r
f) (Prob forall x. ((x, d) -> r) -> (x, c) -> r
g) = (forall x. ((x, (b, d)) -> r) -> (x, (a, c)) -> r)
-> Prob (->) r (a, c) (b, d)
forall {k} (arr :: * -> k -> *) (r :: k) a b.
(forall x. arr (x, b) r -> arr (x, a) r) -> Prob arr r a b
Prob ((forall x. ((x, (b, d)) -> r) -> (x, (a, c)) -> r)
-> Prob (->) r (a, c) (b, d))
-> (forall x. ((x, (b, d)) -> r) -> (x, (a, c)) -> r)
-> Prob (->) r (a, c) (b, d)
forall a b. (a -> b) -> a -> b
$ \(x, (b, d)) -> r
k ->
let kg :: ((x, b), d) -> r
kg ((x
ctx, b
b), d
d) = (x, (b, d)) -> r
k (x
ctx, (b
b, d
d))
gc :: ((x, b), c) -> r
gc = (((x, b), d) -> r) -> ((x, b), c) -> r
forall x. ((x, d) -> r) -> (x, c) -> r
g ((x, b), d) -> r
kg
kf :: ((x, c), b) -> r
kf ((x
ctx, c
c), b
b) = ((x, b), c) -> r
gc ((x
ctx, b
b), c
c)
fa :: ((x, c), a) -> r
fa = (((x, c), b) -> r) -> ((x, c), a) -> r
forall x. ((x, b) -> r) -> (x, a) -> r
f ((x, c), b) -> r
kf
in \(x
ctx, (a
a, c
c)) -> ((x, c), a) -> r
fa ((x
ctx, c
c), a
a)
{-# INLINE parFG #-}
parGF ::
Prob (->) r a b ->
Prob (->) r c d ->
Prob (->) r (a, c) (b, d)
parGF :: forall r a b c d.
Prob (->) r a b -> Prob (->) r c d -> Prob (->) r (a, c) (b, d)
parGF (Prob forall x. ((x, b) -> r) -> (x, a) -> r
f) (Prob forall x. ((x, d) -> r) -> (x, c) -> r
g) = (forall x. ((x, (b, d)) -> r) -> (x, (a, c)) -> r)
-> Prob (->) r (a, c) (b, d)
forall {k} (arr :: * -> k -> *) (r :: k) a b.
(forall x. arr (x, b) r -> arr (x, a) r) -> Prob arr r a b
Prob ((forall x. ((x, (b, d)) -> r) -> (x, (a, c)) -> r)
-> Prob (->) r (a, c) (b, d))
-> (forall x. ((x, (b, d)) -> r) -> (x, (a, c)) -> r)
-> Prob (->) r (a, c) (b, d)
forall a b. (a -> b) -> a -> b
$ \(x, (b, d)) -> r
k ->
let kf :: ((x, d), b) -> r
kf ((x
ctx, d
d), b
b) = (x, (b, d)) -> r
k (x
ctx, (b
b, d
d))
fa :: ((x, d), a) -> r
fa = (((x, d), b) -> r) -> ((x, d), a) -> r
forall x. ((x, b) -> r) -> (x, a) -> r
f ((x, d), b) -> r
kf
kg :: ((x, a), d) -> r
kg ((x
ctx, a
a), d
d) = ((x, d), a) -> r
fa ((x
ctx, d
d), a
a)
gb :: ((x, a), c) -> r
gb = (((x, a), d) -> r) -> ((x, a), c) -> r
forall x. ((x, d) -> r) -> (x, c) -> r
g ((x, a), d) -> r
kg
in \(x
ctx, (a
a, c
c)) -> ((x, a), c) -> r
gb ((x
ctx, a
a), c
c)
{-# INLINE parGF #-}
traceE ::
Prob (->) r (Either a s) (Either b s) ->
Prob (->) r a b
traceE :: forall r a s b.
Prob (->) r (Either a s) (Either b s) -> Prob (->) r a b
traceE (Prob forall x. ((x, Either b s) -> r) -> (x, Either a s) -> r
f) = (forall x. ((x, b) -> r) -> (x, a) -> r) -> Prob (->) r a b
forall {k} (arr :: * -> k -> *) (r :: k) a b.
(forall x. arr (x, b) r -> arr (x, a) r) -> Prob arr r a b
Prob ((forall x. ((x, b) -> r) -> (x, a) -> r) -> Prob (->) r a b)
-> (forall x. ((x, b) -> r) -> (x, a) -> r) -> Prob (->) r a b
forall a b. (a -> b) -> a -> b
$ \(x, b) -> r
k ->
let step :: (x, Either b s) -> r
step (x
x, Left b
b) = (x, b) -> r
k (x
x, b
b)
step (x
x, Right s
s) = ((x, Either b s) -> r) -> (x, Either a s) -> r
forall x. ((x, Either b s) -> r) -> (x, Either a s) -> r
f (x, Either b s) -> r
step (x
x, s -> Either a s
forall a b. b -> Either a b
Right s
s)
in \(x
x, a
a) -> ((x, Either b s) -> r) -> (x, Either a s) -> r
forall x. ((x, Either b s) -> r) -> (x, Either a s) -> r
f (x, Either b s) -> r
step (x
x, a -> Either a s
forall a b. a -> Either a b
Left a
a)
{-# INLINE traceE #-}
traceEN ::
r ->
Int ->
Prob (->) r (Either a s) (Either b s) ->
Prob (->) r a b
traceEN :: forall r a s b.
r
-> Int -> Prob (->) r (Either a s) (Either b s) -> Prob (->) r a b
traceEN r
zero Int
n0 (Prob forall x. ((x, Either b s) -> r) -> (x, Either a s) -> r
f) = (forall x. ((x, b) -> r) -> (x, a) -> r) -> Prob (->) r a b
forall {k} (arr :: * -> k -> *) (r :: k) a b.
(forall x. arr (x, b) r -> arr (x, a) r) -> Prob arr r a b
Prob ((forall x. ((x, b) -> r) -> (x, a) -> r) -> Prob (->) r a b)
-> (forall x. ((x, b) -> r) -> (x, a) -> r) -> Prob (->) r a b
forall a b. (a -> b) -> a -> b
$ \(x, b) -> r
k ->
let step :: Int -> (x, Either b s) -> r
step Int
_ (x
x, Left b
b) = (x, b) -> r
k (x
x, b
b)
step Int
n (x
x, Right s
s)
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = r
zero
| Bool
otherwise = ((x, Either b s) -> r) -> (x, Either a s) -> r
forall x. ((x, Either b s) -> r) -> (x, Either a s) -> r
f (Int -> (x, Either b s) -> r
step (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)) (x
x, s -> Either a s
forall a b. b -> Either a b
Right s
s)
in \(x
x, a
a) -> ((x, Either b s) -> r) -> (x, Either a s) -> r
forall x. ((x, Either b s) -> r) -> (x, Either a s) -> r
f (Int -> (x, Either b s) -> r
step Int
n0) (x
x, a -> Either a s
forall a b. a -> Either a b
Left a
a)
{-# INLINE traceEN #-}