{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeAbstractions #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans -Wno-partial-fields #-}
module Circuit.Net
(
Net,
lift,
braid,
widen,
sift,
melt,
mirror,
AlgRelevant,
AlgAffine,
AlgCartesian,
AlgCoRelevant,
AlgCoAffine,
AlgCocartesian,
AlgBimonoidal,
AlgNet,
)
where
import Circuit.Bimonoid
( SigCopy (..),
SigDiscard (..),
SigPlus (..),
SigZero (..),
)
import Circuit.Bimonoid qualified as Bm
import Circuit.Category (Category (..), (.>))
import Circuit.Channel (Channel (..), Strength (..), Traced (..))
import Circuit.Dagger qualified as Dg
import Circuit.Layer (Layer (..), run, (:~>))
import Circuit.SMC (FreeSMC, SMC, SigPar (..), SigSwap (..))
import Circuit.SMC qualified as SMC
import Circuit.Syntax (Algebra (..), SigCompose (..), Syntax (..), evalInto, (:+:) (..))
import Circuit.Tensor (Action, Tensor (..), Unit)
import Circuit.Trace (Trace, base, yank)
import Data.Kind (Type)
import Prelude hiding (id, (.))
type Net (w :: Type -> Type -> Type) arr =
Syntax (SigCompose :+: SigPar w :+: SigSwap w :+: SigCopy w :+: SigDiscard w :+: SigPlus w :+: SigZero w) arr
type AlgRelevant w arr = Syntax (SigCompose :+: SigPar w :+: SigSwap w :+: SigCopy w) arr
type AlgAffine w arr = Syntax (SigCompose :+: SigPar w :+: SigSwap w :+: SigDiscard w) arr
type AlgCartesian w arr = Syntax (SigCompose :+: SigPar w :+: SigSwap w :+: SigCopy w :+: SigDiscard w) arr
type AlgCoRelevant w arr = Syntax (SigCompose :+: SigPar w :+: SigSwap w :+: SigPlus w) arr
type AlgCoAffine w arr = Syntax (SigCompose :+: SigPar w :+: SigSwap w :+: SigZero w) arr
type AlgCocartesian w arr = Syntax (SigCompose :+: SigPar w :+: SigSwap w :+: SigPlus w :+: SigZero w) arr
type AlgBimonoidal w arr = Syntax (SigCompose :+: SigPar w :+: SigSwap w :+: SigCopy w :+: SigDiscard w :+: SigPlus w :+: SigZero w) arr
type AlgNet w arr = Net w arr
instance (Category arr) => Category (Net w arr) where
id :: forall a. Net w arr a a
id = arr a a
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
a
a
forall (arr :: * -> * -> *) a b (sig :: Sig).
arr a b -> Syntax sig arr a b
Lift arr a a
forall a. arr a a
forall k (arr :: k -> k -> *) (a :: k). Category arr => arr a a
id
Net w arr b c
f . :: forall b c a. Net w arr b c -> Net w arr a b -> Net w arr a c
. Net w arr a b
g = (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
arr
(Net w arr)
a
c
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
a
c
forall (sig :: Sig) (arr :: * -> * -> *) a b.
sig arr (Syntax sig arr) a b -> Syntax sig arr a b
Op (SigCompose arr (Net w arr) a c
-> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
arr
(Net w arr)
a
c
forall {k} {k1} {k2} {k3} (sig1 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig2 :: k -> k1 -> k2 -> k3 -> *).
sig1 arr rec a b -> (:+:) sig1 sig2 arr rec a b
L (Net w arr b c -> Net w arr a b -> SigCompose arr (Net w arr) a c
forall {k1} {k} (rec :: k1 -> k1 -> *) (b1 :: k1) (b :: k1)
(a :: k1) (arr :: k).
rec b1 b -> rec a b1 -> SigCompose arr rec a b
SigCompose Net w arr b c
f Net w arr a b
g))
lift :: arr a b -> Net w arr a b
lift :: forall (arr :: * -> * -> *) a b (w :: * -> * -> *).
arr a b -> Net w arr a b
lift = arr a b
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
a
b
forall (arr :: * -> * -> *) a b (sig :: Sig).
arr a b -> Syntax sig arr a b
Lift
braid :: Net w arr (w a b) (w b a)
braid :: forall (w :: * -> * -> *) (arr :: * -> * -> *) a b.
Net w arr (w a b) (w b a)
braid = (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
(w a b)
(w b a)
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
(w a b)
(w b a)
forall (sig :: Sig) (arr :: * -> * -> *) a b.
sig arr (Syntax sig arr) a b -> Syntax sig arr a b
Op ((:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
(w a b)
(w b a)
-> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
(w a b)
(w b a)
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R ((:+:)
(SigSwap w)
(SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
(w a b)
(w b a)
-> (:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
(w a b)
(w b a)
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R (SigSwap
w
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
(w a b)
(w b a)
-> (:+:)
(SigSwap w)
(SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
(w a b)
(w b a)
forall {k} {k1} {k2} {k3} (sig1 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig2 :: k -> k1 -> k2 -> k3 -> *).
sig1 arr rec a b -> (:+:) sig1 sig2 arr rec a b
L SigSwap
w
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
(w a b)
(w b a)
forall {k} {k1} (w :: * -> * -> *) (arr :: k) (rec :: k1) a1 b1.
SigSwap w arr rec (w a1 b1) (w b1 a1)
SigSwap)))
widen :: SMC w arr a b -> Net w arr a b
widen :: forall (w :: * -> * -> *) (arr :: * -> * -> *) a b.
SMC w arr a b -> Net w arr a b
widen (Lift arr a b
f) = arr a b
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
a
b
forall (arr :: * -> * -> *) a b (sig :: Sig).
arr a b -> Syntax sig arr a b
Lift arr a b
f
widen (Op (:+:)
SigCompose
(SigPar w :+: SigSwap w)
arr
(Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr)
a
b
op) = case (:+:)
SigCompose
(SigPar w :+: SigSwap w)
arr
(Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr)
a
b
op of
L (SigCompose Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr b1 b
g Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr a b1
f) -> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
a
b
forall (sig :: Sig) (arr :: * -> * -> *) a b.
sig arr (Syntax sig arr) a b -> Syntax sig arr a b
Op (SigCompose
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
-> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
forall {k} {k1} {k2} {k3} (sig1 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig2 :: k -> k1 -> k2 -> k3 -> *).
sig1 arr rec a b -> (:+:) sig1 sig2 arr rec a b
L (Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
b1
b
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
a
b1
-> SigCompose
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
forall {k1} {k} (rec :: k1 -> k1 -> *) (b1 :: k1) (b :: k1)
(a :: k1) (arr :: k).
rec b1 b -> rec a b1 -> SigCompose arr rec a b
SigCompose (Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr b1 b
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
b1
b
forall (w :: * -> * -> *) (arr :: * -> * -> *) a b.
SMC w arr a b -> Net w arr a b
widen Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr b1 b
g) (Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr a b1
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
a
b1
forall (w :: * -> * -> *) (arr :: * -> * -> *) a b.
SMC w arr a b -> Net w arr a b
widen Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr a b1
f)))
R (L (SigPar Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr a1 b1
f Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr c d
g)) -> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
a
b
forall (sig :: Sig) (arr :: * -> * -> *) a b.
sig arr (Syntax sig arr) a b -> Syntax sig arr a b
Op ((:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
-> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R (SigPar
w
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
-> (:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
forall {k} {k1} {k2} {k3} (sig1 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig2 :: k -> k1 -> k2 -> k3 -> *).
sig1 arr rec a b -> (:+:) sig1 sig2 arr rec a b
L (Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
a1
b1
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
c
d
-> SigPar
w
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
(w a1 c)
(w b1 d)
forall {k} (rec :: * -> * -> *) a1 b1 c d (w :: * -> * -> *)
(arr :: k).
rec a1 b1 -> rec c d -> SigPar w arr rec (w a1 c) (w b1 d)
SigPar (Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr a1 b1
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
a1
b1
forall (w :: * -> * -> *) (arr :: * -> * -> *) a b.
SMC w arr a b -> Net w arr a b
widen Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr a1 b1
f) (Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr c d
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
c
d
forall (w :: * -> * -> *) (arr :: * -> * -> *) a b.
SMC w arr a b -> Net w arr a b
widen Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr c d
g))))
R (R SigSwap
w arr (Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr) a b
SigSwap) -> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
a
b
forall (sig :: Sig) (arr :: * -> * -> *) a b.
sig arr (Syntax sig arr) a b -> Syntax sig arr a b
Op ((:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
-> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R ((:+:)
(SigSwap w)
(SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
-> (:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R (SigSwap
w
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
-> (:+:)
(SigSwap w)
(SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
forall {k} {k1} {k2} {k3} (sig1 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig2 :: k -> k1 -> k2 -> k3 -> *).
sig1 arr rec a b -> (:+:) sig1 sig2 arr rec a b
L SigSwap
w
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
a
b
SigSwap
w
arr
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr)
(w a1 b1)
(w b1 a1)
forall {k} {k1} (w :: * -> * -> *) (arr :: k) (rec :: k1) a1 b1.
SigSwap w arr rec (w a1 b1) (w b1 a1)
SigSwap)))
sift ::
forall w arr a b.
(Action w arr) =>
Net w arr a b ->
SMC w arr a b
sift :: forall (w :: * -> * -> *) (arr :: * -> * -> *) a b.
Action w arr =>
Net w arr a b -> SMC w arr a b
sift = (forall x y.
arr x y
-> Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr x y)
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
a
b
-> Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr a b
forall (arr' :: * -> * -> *) (sig :: Sig) (arr :: * -> * -> *) a b.
(Category arr', Algebra sig arr arr', Ctx sig arr arr') =>
(forall x y. arr x y -> arr' x y) -> Syntax sig arr a b -> arr' a b
evalInto arr x y -> SMC w arr x y
forall x y.
arr x y -> Syntax (SigCompose :+: (SigPar w :+: SigSwap w)) arr x y
forall (arr :: * -> * -> *) a b (w :: * -> * -> *).
arr a b -> SMC w arr a b
SMC.lift
melt ::
forall w t arr a b.
(Traced t arr, Action w arr) =>
Net w arr a b ->
Trace t arr a b
melt :: forall (w :: * -> * -> *) (t :: * -> * -> *) (arr :: * -> * -> *) a
b.
(Traced t arr, Action w arr) =>
Net w arr a b -> Trace t arr a b
melt = (forall x y. arr x y -> Syntax (SigCompose :+: SigYank t) arr x y)
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
a
b
-> Syntax (SigCompose :+: SigYank t) arr a b
forall (arr' :: * -> * -> *) (sig :: Sig) (arr :: * -> * -> *) a b.
(Category arr', Algebra sig arr arr', Ctx sig arr arr') =>
(forall x y. arr x y -> arr' x y) -> Syntax sig arr a b -> arr' a b
evalInto arr x y -> Trace t arr x y
forall x y. arr x y -> Syntax (SigCompose :+: SigYank t) arr x y
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base
mirror ::
forall w arr a b.
(forall x. Bm.BimonoidT w arr x) =>
Net w (Dg.Dagger arr) a b ->
Net w (Dg.Dagger arr) b a
mirror :: forall (w :: * -> * -> *) (arr :: * -> * -> *) a b.
(forall x. BimonoidT w arr x) =>
Net w (Dagger arr) a b -> Net w (Dagger arr) b a
mirror (Lift Dagger arr a b
d) = Dagger arr b a
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b
a
forall (arr :: * -> * -> *) a b (sig :: Sig).
arr a b -> Syntax sig arr a b
Lift (Dagger arr a b -> Dagger arr b a
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Dagger arr a b -> Dagger arr b a
Dg.transpose Dagger arr a b
d)
mirror (Op (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
a
b
op) = case (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
a
b
op of
L (SigCompose Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b1
b
g Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
a
b1
f) -> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b
a
forall (sig :: Sig) (arr :: * -> * -> *) a b.
sig arr (Syntax sig arr) a b -> Syntax sig arr a b
Op (SigCompose
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig1 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig2 :: k -> k1 -> k2 -> k3 -> *).
sig1 arr rec a b -> (:+:) sig1 sig2 arr rec a b
L (Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b1
a
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b
b1
-> SigCompose
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k1} {k} (rec :: k1 -> k1 -> *) (b1 :: k1) (b :: k1)
(a :: k1) (arr :: k).
rec b1 b -> rec a b1 -> SigCompose arr rec a b
SigCompose (Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
a
b1
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b1
a
forall (w :: * -> * -> *) (arr :: * -> * -> *) a b.
(forall x. BimonoidT w arr x) =>
Net w (Dagger arr) a b -> Net w (Dagger arr) b a
mirror Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
a
b1
f) (Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b1
b
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b
b1
forall (w :: * -> * -> *) (arr :: * -> * -> *) a b.
(forall x. BimonoidT w arr x) =>
Net w (Dagger arr) a b -> Net w (Dagger arr) b a
mirror Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b1
b
g)))
R (L (SigPar Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
a1
b1
f Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
c
d
g)) -> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b
a
forall (sig :: Sig) (arr :: * -> * -> *) a b.
sig arr (Syntax sig arr) a b -> Syntax sig arr a b
Op ((:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R (SigPar
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig1 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig2 :: k -> k1 -> k2 -> k3 -> *).
sig1 arr rec a b -> (:+:) sig1 sig2 arr rec a b
L (Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b1
a1
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
d
c
-> SigPar
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
(w b1 d)
(w a1 c)
forall {k} (rec :: * -> * -> *) a1 b1 c d (w :: * -> * -> *)
(arr :: k).
rec a1 b1 -> rec c d -> SigPar w arr rec (w a1 c) (w b1 d)
SigPar (Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
a1
b1
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b1
a1
forall (w :: * -> * -> *) (arr :: * -> * -> *) a b.
(forall x. BimonoidT w arr x) =>
Net w (Dagger arr) a b -> Net w (Dagger arr) b a
mirror Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
a1
b1
f) (Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
c
d
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
d
c
forall (w :: * -> * -> *) (arr :: * -> * -> *) a b.
(forall x. BimonoidT w arr x) =>
Net w (Dagger arr) a b -> Net w (Dagger arr) b a
mirror Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
c
d
g))))
R (R (L SigSwap
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
a
b
SigSwap)) -> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b
a
forall (sig :: Sig) (arr :: * -> * -> *) a b.
sig arr (Syntax sig arr) a b -> Syntax sig arr a b
Op ((:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R ((:+:)
(SigSwap w)
(SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R (SigSwap
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigSwap w)
(SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig1 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig2 :: k -> k1 -> k2 -> k3 -> *).
sig1 arr rec a b -> (:+:) sig1 sig2 arr rec a b
L SigSwap
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
SigSwap
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
(w b1 a1)
(w a1 b1)
forall {k} {k1} (w :: * -> * -> *) (arr :: k) (rec :: k1) a1 b1.
SigSwap w arr rec (w a1 b1) (w b1 a1)
SigSwap)))
R (R (R (L SigCopy
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
a
b
SigCopy))) -> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b
a
forall (sig :: Sig) (arr :: * -> * -> *) a b.
sig arr (Syntax sig arr) a b -> Syntax sig arr a b
Op ((:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R ((:+:)
(SigSwap w)
(SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R ((:+:)
(SigCopy w)
(SigDiscard w :+: (SigPlus w :+: SigZero w))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigSwap w)
(SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R ((:+:)
(SigDiscard w)
(SigPlus w :+: SigZero w)
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigCopy w)
(SigDiscard w :+: (SigPlus w :+: SigZero w))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R ((:+:)
(SigPlus w)
(SigZero w)
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigDiscard w)
(SigPlus w :+: SigZero w)
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R (SigPlus
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigPlus w)
(SigZero w)
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig1 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig2 :: k -> k1 -> k2 -> k3 -> *).
sig1 arr rec a b -> (:+:) sig1 sig2 arr rec a b
L SigPlus
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
SigPlus
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
(w a a)
a
forall {k} (w :: * -> * -> *) (arr :: * -> * -> *) b (rec :: k).
MergeT w arr b =>
SigPlus w arr rec (w b b) b
SigPlus))))))
R (R (R (R (L SigDiscard
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
a
b
SigDiscard)))) -> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b
a
forall (sig :: Sig) (arr :: * -> * -> *) a b.
sig arr (Syntax sig arr) a b -> Syntax sig arr a b
Op ((:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R ((:+:)
(SigSwap w)
(SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R ((:+:)
(SigCopy w)
(SigDiscard w :+: (SigPlus w :+: SigZero w))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigSwap w)
(SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R ((:+:)
(SigDiscard w)
(SigPlus w :+: SigZero w)
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigCopy w)
(SigDiscard w :+: (SigPlus w :+: SigZero w))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R ((:+:)
(SigPlus w)
(SigZero w)
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigDiscard w)
(SigPlus w :+: SigZero w)
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R (SigZero
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigPlus w)
(SigZero w)
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R SigZero
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
SigZero
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
(Unit w)
a
forall {k} (w :: * -> * -> *) (arr :: * -> * -> *) b (rec :: k).
ZeroT w arr b =>
SigZero w arr rec (Unit w) b
SigZero))))))
R (R (R (R (R (L SigPlus
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
a
b
SigPlus))))) -> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b
a
forall (sig :: Sig) (arr :: * -> * -> *) a b.
sig arr (Syntax sig arr) a b -> Syntax sig arr a b
Op ((:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R ((:+:)
(SigSwap w)
(SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R ((:+:)
(SigCopy w)
(SigDiscard w :+: (SigPlus w :+: SigZero w))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigSwap w)
(SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R (SigCopy
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigCopy w)
(SigDiscard w :+: (SigPlus w :+: SigZero w))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig1 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig2 :: k -> k1 -> k2 -> k3 -> *).
sig1 arr rec a b -> (:+:) sig1 sig2 arr rec a b
L SigCopy
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
SigCopy
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
(w b b)
forall {k} (w :: * -> * -> *) (arr :: * -> * -> *) a (rec :: k).
CopyT w arr a =>
SigCopy w arr rec a (w a a)
SigCopy))))
R (R (R (R (R (R SigZero
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
a
b
SigZero))))) -> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr)
b
a
forall (sig :: Sig) (arr :: * -> * -> *) a b.
sig arr (Syntax sig arr) a b -> Syntax sig arr a b
Op ((:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
SigCompose
(SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R ((:+:)
(SigSwap w)
(SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigPar w)
(SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R ((:+:)
(SigCopy w)
(SigDiscard w :+: (SigPlus w :+: SigZero w))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigSwap w)
(SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R ((:+:)
(SigDiscard w)
(SigPlus w :+: SigZero w)
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigCopy w)
(SigDiscard w :+: (SigPlus w :+: SigZero w))
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig2 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig1 :: k -> k1 -> k2 -> k3 -> *).
sig2 arr rec a b -> (:+:) sig1 sig2 arr rec a b
R (SigDiscard
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
-> (:+:)
(SigDiscard w)
(SigPlus w :+: SigZero w)
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
forall {k} {k1} {k2} {k3} (sig1 :: k -> k1 -> k2 -> k3 -> *)
(arr :: k) (rec :: k1) (a :: k2) (b :: k3)
(sig2 :: k -> k1 -> k2 -> k3 -> *).
sig1 arr rec a b -> (:+:) sig1 sig2 arr rec a b
L SigDiscard
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
a
SigDiscard
w
(Dagger arr)
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
(Dagger arr))
b
(Unit w)
forall {k} (w :: * -> * -> *) (arr :: * -> * -> *) a (rec :: k).
DiscardT w arr a =>
SigDiscard w arr rec a (Unit w)
SigDiscard)))))
instance Layer (Syntax (SigCompose :+: SigPar w :+: SigSwap w :+: SigCopy w :+: SigDiscard w :+: SigPlus w :+: SigZero w)) where
type Law (Syntax (SigCompose :+: SigPar w :+: SigSwap w :+: SigCopy w :+: SigDiscard w :+: SigPlus w :+: SigZero w)) arr' = FreeSMC w arr'
type Run (Syntax (SigCompose :+: SigPar w :+: SigSwap w :+: SigCopy w :+: SigDiscard w :+: SigPlus w :+: SigZero w)) arr = Action w arr
type Bind (Syntax (SigCompose :+: SigPar w :+: SigSwap w :+: SigCopy w :+: SigDiscard w :+: SigPlus w :+: SigZero w)) arr = ()
unit :: forall (arr :: * -> * -> *).
Category arr =>
arr
:~> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
unit = arr x y -> Net w arr x y
forall (arr :: * -> * -> *) a b (w :: * -> * -> *).
arr a b -> Net w arr a b
lift
bind ::
forall arr' arr a b.
(Law (Syntax (SigCompose :+: SigPar w :+: SigSwap w :+: SigCopy w :+: SigDiscard w :+: SigPlus w :+: SigZero w)) arr') =>
(arr :~> arr') ->
Syntax (SigCompose :+: SigPar w :+: SigSwap w :+: SigCopy w :+: SigDiscard w :+: SigPlus w :+: SigZero w) arr a b ->
arr' a b
bind :: forall (arr' :: * -> * -> *) (arr :: * -> * -> *) a b.
Law
(Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w
:+: (SigDiscard w :+: (SigPlus w :+: SigZero w)))))))
arr' =>
(arr :~> arr')
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
a
b
-> arr' a b
bind arr :~> arr'
h = (arr :~> arr')
-> Syntax
(SigCompose
:+: (SigPar w
:+: (SigSwap w
:+: (SigCopy w :+: (SigDiscard w :+: (SigPlus w :+: SigZero w))))))
arr
a
b
-> arr' a b
forall (arr' :: * -> * -> *) (sig :: Sig) (arr :: * -> * -> *) a b.
(Category arr', Algebra sig arr arr', Ctx sig arr arr') =>
(forall x y. arr x y -> arr' x y) -> Syntax sig arr a b -> arr' a b
evalInto arr x y -> arr' x y
arr :~> arr'
h