3 | module Control.Category.Instances.Kleisli
5 | import Control.Category
6 | import Control.Category.Records
17 | record Kleisli (cat : Hom obj) (m : obj -> obj) (a,b : obj) where
18 | constructor MkKleisli
19 | runKleisli : cat a (m b)
27 | {m : _} -> Category cat => CatMonad cat m => Category (Kleisli cat m) where
29 | MkKleisli f . MkKleisli g = MkKleisli (join . map f . g)
32 | [KleisliInj] {m : _} -> Category cat => CatMonad cat m => CatFunctor cat (Kleisli cat m) Prelude.id where
33 | map f = MkKleisli $
unit . f
36 | {m : _} -> Promonad0 cat => CatMonad cat m => Promonad0 (Kleisli cat m) where
37 | fromFuncW f = MkKleisli (unit . fromFuncW f)
43 | KleisliBinoidal : {ten,m : _} -> Category cat => StrongMonad cat ten m =>
44 | EndoBinoidal cat ten => EndoBinoidal (Kleisli cat m) ten
45 | KleisliBinoidal = Impl
47 | [Impl] CatBifunctor (Kleisli cat m) (Kleisli cat m) (Kleisli cat m) ten where
48 | bimap (MkKleisli f) (MkKleisli g) =
49 | MkKleisli (strongl . mapr' g) .
50 | MkKleisli (strongr . mapl' f)
55 | KleisliPreMonoidal : {m,ten,i : _} -> PreMonoidal cat ten i => StrongMonad cat ten m =>
56 | PreMonoidal (Kleisli cat m) ten i
57 | KleisliPreMonoidal =
58 | MkMonoidal (MkKleisli $
unit . assoc)
59 | (MkKleisli $
unit . assoc')
60 | (MkKleisli $
unit . unitl)
61 | (MkKleisli $
unit . unitl')
62 | (MkKleisli $
unit . unitr)
63 | (MkKleisli $
unit . unitr')
66 | KleisliPreBraided : {m,ten,i : _} -> PreBraided cat ten i => StrongMonad cat ten m =>
67 | PreBraided (Kleisli cat m) ten i
69 | MkBraided (MkKleisli $
unit . braid)
70 | (MkKleisli $
unit . braid')
73 | KleisliPreSymmetric : {m,ten,i : _} -> PreSymmetric cat ten i => StrongMonad cat ten m =>
74 | PreSymmetric (Kleisli cat m) ten i
75 | KleisliPreSymmetric =
76 | MkMonSymmetric (\p => MkKleisli $
Core.(.) unit $
permute p)
79 | KleisliPreCartesian : {m,ten,i : _} -> PreCartesian cat ten i => StrongMonad cat ten m =>
80 | PreCartesian (Kleisli cat m) ten i
81 | KleisliPreCartesian =
82 | MkCartesian (MkKleisli $
unit . projl)
83 | (MkKleisli $
unit . projr)
84 | (\f,g => bimap' f g . (MkKleisli $
unit . split))
85 | (MkKleisli $
unit . split)
86 | (MkKleisli $
unit . elim {ten})
89 | KleisliPreCocartesian : {m,ten,i : _} -> PreCocartesian cat ten i => StrongMonad cat ten m =>
90 | PreCocartesian (Kleisli cat m) ten i
91 | KleisliPreCocartesian =
92 | MkCocartesian (MkKleisli $
unit . injl)
93 | (MkKleisli $
unit . injr)
94 | (\f,g => (MkKleisli $
unit . merge) . bimap' f g)
95 | (MkKleisli $
unit . merge)
96 | (MkKleisli $
unit . intro {ten})
99 | KleisliPreBimonoidal : {m,add,mul,z,i : _} -> PreBimonoidal cat add mul z i =>
100 | (StrongMonad cat add m, StrongMonad cat mul m) =>
101 | PreBimonoidal (Kleisli cat m) add mul z i
102 | KleisliPreBimonoidal @{_} @{(c@(impl,_),_)} =
103 | MkBimonoidal (MkKleisli $
unit @{impl} . distribl)
104 | (MkKleisli $
unit @{impl} . distribl')
105 | (MkKleisli $
unit @{impl} . distribr)
106 | (MkKleisli $
unit @{impl} . distribr')
107 | (MkKleisli $
unit @{impl} . absorbl {add,mul})
108 | (MkKleisli $
unit @{impl} . absorbl' {add,mul})
109 | (MkKleisli $
unit @{impl} . absorbr {add,mul})
110 | (MkKleisli $
unit @{impl} . absorbr' {add,mul})
117 | namespace CategoryR
119 | Kleisli : (cat : CategoryR) -> (m : MonadR cat) -> CategoryR
120 | Kleisli (MkCategoryR cat) (MkMonadR m) = MkCategoryR (Kleisli cat m)
124 | KleisliInj : {cat,m : _} -> FunctorR cat (Kleisli cat m)
125 | KleisliInj {cat=MkCategoryR{}} {m=MkMonadR{}} = MkFunctorR Prelude.id {impl = KleisliInj}
127 | namespace MonoidalR
129 | Kleisli : (cat : PreMonoidalR) -> (m : StrongMonadR cat) -> PreMonoidalR
130 | Kleisli (MkMonoidalR cat ten i) (MkStrongMonadR m) = MkMonoidalR (Kleisli cat m) ten i
134 | Kleisli : (cat : PreBraidedR) -> (m : StrongMonadR cat.monoidalR) -> PreBraidedR
135 | Kleisli (MkBraidedR cat ten i) (MkStrongMonadR m) = MkBraidedR (Kleisli cat m) ten i
137 | namespace SymmetricR
139 | Kleisli : (cat : PreSymmetricR) -> (m : StrongMonadR cat.monoidalR) -> PreSymmetricR
140 | Kleisli (MkSymmetricR cat ten i) (MkStrongMonadR m) = MkSymmetricR (Kleisli cat m) ten i
142 | namespace CartesianR
144 | Kleisli : (cat : PreCartesianR) -> (m : StrongMonadR cat.monoidalR) -> PreCartesianR
145 | Kleisli (MkCartesianR cat ten i) (MkStrongMonadR m) = MkCartesianR (Kleisli cat m) ten i
147 | namespace CocartesianR
149 | Kleisli : (cat : PreCocartesianR) -> (m : StrongMonadR cat.monoidalR) -> PreCocartesianR
150 | Kleisli (MkCocartesianR cat ten i) (MkStrongMonadR m) = MkCocartesianR (Kleisli cat m) ten i