2 | module Control.Category.Instances.Cokleisli
4 | import Control.Category
5 | import Control.Category.Records
16 | record Cokleisli (cat : Hom obj) (w : obj -> obj) (a,b : obj) where
17 | constructor MkCokleisli
18 | runCokleisli : cat (w a) b
26 | {w : _} -> Category cat => CatComonad cat w => Category (Cokleisli cat w) where
27 | id = MkCokleisli counit
28 | MkCokleisli f . MkCokleisli g = MkCokleisli (f . map g . cojoin)
31 | [CokleisliInj] {w : _} -> Category cat => CatComonad cat w => CatFunctor cat (Cokleisli cat w) Prelude.id where
32 | map f = MkCokleisli $
f . counit
35 | {w : _} -> Promonad0 cat => CatComonad cat w => Promonad0 (Cokleisli cat w) where
36 | fromFuncW f = MkCokleisli (fromFuncW f . counit)
41 | CokleisliBinoidal : {ten,w : _} -> Category cat => StrongComonad cat ten w =>
42 | EndoBinoidal cat ten => EndoBinoidal (Cokleisli cat w) ten
43 | CokleisliBinoidal = Impl
45 | [Impl] CatBifunctor (Cokleisli cat w) (Cokleisli cat w) (Cokleisli cat w) ten where
46 | bimap (MkCokleisli f) (MkCokleisli g) =
47 | MkCokleisli (mapr' g . costrongl) .
48 | MkCokleisli (mapl' f . costrongr)
53 | CokleisliPreMonoidal : {w,ten,i : _} -> PreMonoidal cat ten i => StrongComonad cat ten w =>
54 | PreMonoidal (Cokleisli cat w) ten i
55 | CokleisliPreMonoidal =
56 | MkMonoidal (MkCokleisli $
assoc . counit)
57 | (MkCokleisli $
assoc' . counit)
58 | (MkCokleisli $
unitl . counit)
59 | (MkCokleisli $
unitl' . counit)
60 | (MkCokleisli $
unitr . counit)
61 | (MkCokleisli $
unitr' . counit)
64 | CokleisliPreBraided : {w,ten,i : _} -> PreBraided cat ten i => StrongComonad cat ten w =>
65 | PreBraided (Cokleisli cat w) ten i
66 | CokleisliPreBraided =
67 | MkBraided (MkCokleisli $
braid . counit)
68 | (MkCokleisli $
braid' . counit)
71 | CokleisliPreSymmetric : {w,ten,i : _} -> PreSymmetric cat ten i => StrongComonad cat ten w =>
72 | PreSymmetric (Cokleisli cat w) ten i
73 | CokleisliPreSymmetric =
74 | MkMonSymmetric (\p => MkCokleisli $
Core.(.) (permute p) counit)
77 | CokleisliPreCartesian : {w,ten,i : _} -> PreCartesian cat ten i => StrongComonad cat ten w =>
78 | PreCartesian (Cokleisli cat w) ten i
79 | CokleisliPreCartesian =
80 | MkCartesian (MkCokleisli $
projl . counit)
81 | (MkCokleisli $
projr . counit)
82 | (\f,g => bimap' f g . (MkCokleisli $
split . counit))
83 | (MkCokleisli $
split . counit)
84 | (MkCokleisli $
elim {ten} . counit)
87 | CokleisliPreCocartesian : {w,ten,i : _} -> PreCocartesian cat ten i => StrongComonad cat ten w =>
88 | PreCocartesian (Cokleisli cat w) ten i
89 | CokleisliPreCocartesian =
90 | MkCocartesian (MkCokleisli $
injl . counit)
91 | (MkCokleisli $
injr . counit)
92 | (\f,g => (MkCokleisli $
merge . counit) . bimap' f g)
93 | (MkCokleisli $
merge . counit)
94 | (MkCokleisli $
intro {ten} . counit)
97 | CokleisliPreBimonoidal : {w,add,mul,z,i : _} -> PreBimonoidal cat add mul z i =>
98 | (StrongComonad cat add w, StrongComonad cat mul w) =>
99 | PreBimonoidal (Cokleisli cat w) add mul z i
100 | CokleisliPreBimonoidal @{_} @{(c@(impl,_),_)} =
101 | MkBimonoidal (MkCokleisli $
distribl . counit @{impl})
102 | (MkCokleisli $
distribl' . counit @{impl})
103 | (MkCokleisli $
distribr . counit @{impl})
104 | (MkCokleisli $
distribr' . counit @{impl})
105 | (MkCokleisli $
absorbl {add,mul} . counit @{impl})
106 | (MkCokleisli $
absorbl' {add,mul} . counit @{impl})
107 | (MkCokleisli $
absorbr {add,mul} . counit @{impl})
108 | (MkCokleisli $
absorbr' {add,mul} . counit @{impl})
115 | namespace CategoryR
117 | Cokleisli : (cat : CategoryR) -> (w : ComonadR cat) -> CategoryR
118 | Cokleisli (MkCategoryR cat) (MkComonadR w) = MkCategoryR (Cokleisli cat w)
122 | CokleisliInj : {cat,w : _} -> FunctorR cat (Cokleisli cat w)
123 | CokleisliInj {cat=MkCategoryR{}} {w=MkComonadR{}} = MkFunctorR Prelude.id {impl = CokleisliInj}
125 | namespace MonoidalR
127 | Cokleisli : (cat : PreMonoidalR) -> (w : StrongComonadR cat) -> PreMonoidalR
128 | Cokleisli (MkMonoidalR cat ten i) (MkStrongComonadR w) = MkMonoidalR (Cokleisli cat w) ten i
132 | Cokleisli : (cat : PreBraidedR) -> (w : StrongComonadR cat.monoidalR) -> PreBraidedR
133 | Cokleisli (MkBraidedR cat ten i) (MkStrongComonadR w) = MkBraidedR (Cokleisli cat w) ten i
135 | namespace SymmetricR
137 | Cokleisli : (cat : PreSymmetricR) -> (w : StrongComonadR cat.monoidalR) -> PreSymmetricR
138 | Cokleisli (MkSymmetricR cat ten i) (MkStrongComonadR w) = MkSymmetricR (Cokleisli cat w) ten i
140 | namespace CartesianR
142 | Cokleisli : (cat : PreCartesianR) -> (w : StrongComonadR cat.monoidalR) -> PreCartesianR
143 | Cokleisli (MkCartesianR cat ten i) (MkStrongComonadR w) = MkCartesianR (Cokleisli cat w) ten i
145 | namespace CocartesianR
147 | Cokleisli : (cat : PreCocartesianR) -> (w : StrongComonadR cat.monoidalR) -> PreCocartesianR
148 | Cokleisli (MkCocartesianR cat ten i) (MkStrongComonadR w) = MkCocartesianR (Cokleisli cat w) ten i