0 | module Control.Category.Bimonoidal
2 | import Control.Category.Core
3 | import Control.Category.Functor
4 | import Control.Category.Monoidal
5 | import Control.Category.Braided
6 | import Control.Category.Cartesian
7 | import Control.Category.Cocartesian
8 | import Data.Morphisms
16 | private infixl 8 `add`
17 | private infixl 9 `mul`
32 | interface (Monoidal cat add z,
Monoidal cat mul i) =>
33 | Bimonoidal (0 cat : Hom obj) (add,mul : obj -> obj -> obj) (z,i : obj) | cat,add,mul where
34 | constructor MkBimonoidal
36 | distribl : {a,b,c : _} -> cat (a `mul` (b `add` c)) (a `mul` b `add` a `mul` c)
38 | distribl' : {a,b,c : _} -> cat (a `mul` b `add` a `mul` c) (a `mul` (b `add` c))
41 | distribr : {a,b,c : _} -> cat ((a `add` b) `mul` c) (a `mul` c `add` b `mul` c)
43 | distribr' : {a,b,c : _} -> cat (a `mul` c `add` b `mul` c) ((a `add` b) `mul` c)
46 | absorbl : {a : _} -> cat (a `mul` z) z
48 | absorbl' : {a : _} -> cat z (a `mul` z)
51 | absorbr : {a : _} -> cat (z `mul` a) z
53 | absorbr' : {a : _} -> cat z (z `mul` a)
58 | PreBimonoidal : (cat : Hom obj) -> (add,mul : obj -> obj -> obj) -> (z,i : obj) -> Type
59 | PreBimonoidal = Bimonoidal
68 | RigCategory : (cat : Hom obj) -> (add,mul : obj -> obj -> obj) -> (z,i : obj) -> Type
69 | RigCategory cat add mul z i = (Bimonoidal cat add mul z i, MonSymmetric cat add z)
74 | PreRigCategory : (cat : Hom obj) -> (add,mul : obj -> obj -> obj) -> (z,i : obj) -> Type
75 | PreRigCategory = RigCategory
83 | SymRigCategory : (cat : Hom obj) -> (add,mul : obj -> obj -> obj) -> (z,i : obj) -> Type
84 | SymRigCategory cat add mul z i = (RigCategory cat add mul z i, MonSymmetric cat mul i)
89 | PreSymRigCategory : (cat : Hom obj) -> (add,mul : obj -> obj -> obj) -> (z,i : obj) -> Type
90 | PreSymRigCategory = SymRigCategory
99 | Distributive : (cat : Hom obj) -> (add,mul : obj -> obj -> obj) -> (z,i : obj) -> Type
100 | Distributive cat add mul z i =
101 | (SymRigCategory cat add mul z i, Cartesian cat mul i, Cocartesian cat add z)
106 | PreDistributive : (cat : Hom obj) -> (add,mul : obj -> obj -> obj) -> (z,i : obj) -> Type
107 | PreDistributive = Distributive
116 | TenSOP : (add,mul : obj -> obj -> obj) -> (z,i : obj) -> List (List obj) -> obj
117 | TenSOP add mul z i = TenSeq add z . map (TenSeq mul i)
129 | Bimonoidal Morphism Either Pair Void () where
130 | distribl = Mor $
\(x,y) => bimap (x,) (x,) y
131 | distribl' = Mor $
either (mapSnd Left) (mapSnd Right)
132 | distribr = Mor $
\(x,y) => bimap (,y) (,y) x
133 | distribr' = Mor $
either (mapFst Left) (mapFst Right)
135 | absorbl' = Mor absurd
137 | absorbr' = Mor absurd
139 | namespace Bimonoidal
141 | [Function] Bimonoidal (~~>) Either Pair Void ()
142 | using Monoidal.FuncPair Monoidal.FuncEither where
143 | distribl = \(x,y) => bimap (x,) (x,) y
144 | distribl' = either (mapSnd Left) (mapSnd Right)
145 | distribr = \(x,y) => bimap (,y) (,y) x
146 | distribr' = either (mapFst Left) (mapFst Right)
152 | namespace RigCategory
154 | Function : RigCategory (~~>) Either Pair Void ()
155 | Function = (Function, FuncEither)
157 | namespace SymRigCategory
159 | Function : SymRigCategory (~~>) Either Pair Void ()
160 | Function = (Function, FuncPair)
162 | namespace Distributive
164 | Function : Distributive (~~>) Either Pair Void ()
165 | Function = (Function, Function, Function)
168 | Monad m => Bimonoidal (Kleislimorphism m) Either Pair Void () where
169 | distribl = Kleisli $
\(x,y) => pure $
bimap (x,) (x,) y
170 | distribl' = Kleisli $
pure . either (mapSnd Left) (mapSnd Right)
171 | distribr = Kleisli $
\(x,y) => pure $
bimap (,y) (,y) x
172 | distribr' = Kleisli $
pure . either (mapFst Left) (mapFst Right)
173 | absorbl = Kleisli $
pure . snd
174 | absorbl' = Kleisli absurd
175 | absorbr = Kleisli $
pure . fst
176 | absorbr' = Kleisli absurd