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 | funitW f = MkKleisli (unit . funitW 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 | KleisliPreCartesian : {m,ten,i : _} -> PreCartesian cat ten i => StrongMonad cat ten m =>
74 | PreCartesian (Kleisli cat m) ten i
75 | KleisliPreCartesian =
76 | MkCartesian (MkKleisli $
unit . projl)
77 | (MkKleisli $
unit . projr)
78 | (\f,g => bimap' f g . (MkKleisli $
unit . split))
79 | (MkKleisli $
unit . split)
80 | (MkKleisli $
unit . elim {ten})
83 | KleisliPreCocartesian : {m,ten,i : _} -> PreCocartesian cat ten i => StrongMonad cat ten m =>
84 | PreCocartesian (Kleisli cat m) ten i
85 | KleisliPreCocartesian =
86 | MkCocartesian (MkKleisli $
unit . injl)
87 | (MkKleisli $
unit . injr)
88 | (\f,g => (MkKleisli $
unit . merge) . bimap' f g)
89 | (MkKleisli $
unit . merge)
90 | (MkKleisli $
unit . intro {ten})
93 | KleisliPreBimonoidal : {m,add,mul,z,i : _} -> PreBimonoidal cat add mul z i =>
94 | (StrongMonad cat add m, StrongMonad cat mul m) =>
95 | PreBimonoidal (Kleisli cat m) add mul z i
96 | KleisliPreBimonoidal @{_} @{(c@(impl,_),_)} =
97 | MkBimonoidal (MkKleisli $
unit @{impl} . distribl)
98 | (MkKleisli $
unit @{impl} . distribl')
99 | (MkKleisli $
unit @{impl} . distribr)
100 | (MkKleisli $
unit @{impl} . distribr')
101 | (MkKleisli $
unit @{impl} . absorbl {add,mul})
102 | (MkKleisli $
unit @{impl} . absorbl' {add,mul})
103 | (MkKleisli $
unit @{impl} . absorbr {add,mul})
104 | (MkKleisli $
unit @{impl} . absorbr' {add,mul})
111 | namespace CategoryR
113 | Kleisli : (cat : CategoryR) -> (m : MonadR cat) -> CategoryR
114 | Kleisli (MkCategoryR cat) (MkMonadR m) = MkCategoryR (Kleisli cat m)
118 | KleisliInj : {cat,m : _} -> FunctorR cat (Kleisli cat m)
119 | KleisliInj {cat=MkCategoryR{}} {m=MkMonadR{}} = MkFunctorR Prelude.id {impl = KleisliInj}
121 | namespace MonoidalR
123 | Kleisli : (cat : PreMonoidalR) -> (m : StrongMonadR cat) -> PreMonoidalR
124 | Kleisli (MkMonoidalR cat ten i) (MkStrongMonadR m) = MkMonoidalR (Kleisli cat m) ten i
128 | Kleisli : (cat : PreBraidedR) -> (m : StrongMonadR cat.monoidalR) -> PreBraidedR
129 | Kleisli (MkBraidedR cat ten i) (MkStrongMonadR m) = MkBraidedR (Kleisli cat m) ten i
131 | namespace CartesianR
133 | Kleisli : (cat : PreCartesianR) -> (m : StrongMonadR cat.monoidalR) -> PreCartesianR
134 | Kleisli (MkCartesianR cat ten i) (MkStrongMonadR m) = MkCartesianR (Kleisli cat m) ten i
136 | namespace CocartesianR
138 | Kleisli : (cat : PreCocartesianR) -> (m : StrongMonadR cat.monoidalR) -> PreCocartesianR
139 | Kleisli (MkCocartesianR cat ten i) (MkStrongMonadR m) = MkCocartesianR (Kleisli cat m) ten i