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, Braided 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, Braided 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
119 | Bimonoidal Morphism Either Pair Void () where
120 | distribl = Mor $
\(x,y) => bimap (x,) (x,) y
121 | distribl' = Mor $
either (mapSnd Left) (mapSnd Right)
122 | distribr = Mor $
\(x,y) => bimap (,y) (,y) x
123 | distribr' = Mor $
either (mapFst Left) (mapFst Right)
125 | absorbl' = Mor absurd
127 | absorbr' = Mor absurd
129 | namespace Bimonoidal
131 | [Function] Bimonoidal (~~>) Either Pair Void ()
132 | using Monoidal.FuncPair Monoidal.FuncEither where
133 | distribl = \(x,y) => bimap (x,) (x,) y
134 | distribl' = either (mapSnd Left) (mapSnd Right)
135 | distribr = \(x,y) => bimap (,y) (,y) x
136 | distribr' = either (mapFst Left) (mapFst Right)
142 | namespace RigCategory
144 | Function : RigCategory (~~>) Either Pair Void ()
145 | Function = (Function, FuncEither)
147 | namespace SymRigCategory
149 | Function : SymRigCategory (~~>) Either Pair Void ()
150 | Function = (Function, FuncPair)
152 | namespace Distributive
154 | Function : Distributive (~~>) Either Pair Void ()
155 | Function = (Function, Function, Function)
158 | Monad m => Bimonoidal (Kleislimorphism m) Either Pair Void () where
159 | distribl = Kleisli $
\(x,y) => pure $
bimap (x,) (x,) y
160 | distribl' = Kleisli $
pure . either (mapSnd Left) (mapSnd Right)
161 | distribr = Kleisli $
\(x,y) => pure $
bimap (,y) (,y) x
162 | distribr' = Kleisli $
pure . either (mapFst Left) (mapFst Right)
163 | absorbl = Kleisli $
pure . snd
164 | absorbl' = Kleisli absurd
165 | absorbr = Kleisli $
pure . fst
166 | absorbr' = Kleisli absurd