0 | module Control.Category.Promonad
2 | import Control.Category.Core
3 | import Control.Category.Semigroupoid
4 | import Control.Category.Functor
5 | import Control.Category.Monoidal
6 | import Control.Category.Braided
7 | import Control.Category.Cartesian
8 | import Control.Category.Cocartesian
9 | import Control.Category.Traced
10 | import Control.Category.Bimonoidal
11 | import Data.Profunctor
12 | import Data.Profunctor.Costrong
14 | import Data.Morphisms
34 | interface Category cat => Promonad (0 cat : Hom Type) where
37 | funit : (a -> b) -> cat a b
42 | interface Category cat => Promonad0 (0 cat : Hom Type0) where
45 | funitW : (a -> b) -> cat (W0 a) (W0 b)
53 | [PromonadUnit] Promonad cat => CatFunctor Morphism cat Prelude.id where
54 | map = funit . applyMor
58 | [PromonadUnit0] Promonad0 cat => CatFunctor Morphism cat (\x => W0 x) where
59 | map = funitW . applyMor
64 | [FromPromonad] {ten,i : _} -> (Promonad cat, CatEndoBifunctor cat ten, Monoidal Morphism ten i) =>
65 | Monoidal cat ten i where
66 | assoc = funit $
applyMor assoc
67 | assoc' = funit $
applyMor assoc'
68 | unitl = funit $
applyMor unitl
69 | unitl' = funit $
applyMor unitl'
70 | unitr = funit $
applyMor unitr
71 | unitr' = funit $
applyMor unitr'
76 | [FromPromonad] {ten,i : _} -> (Promonad cat, CatEndoBifunctor cat ten, Braided Morphism ten i) =>
77 | Braided cat ten i using Monoidal.FromPromonad where
78 | braid = funit $
applyMor braid
83 | [FromPromonad] {ten,i : _} -> (Promonad cat, CatEndoBifunctor cat ten, Cartesian Morphism ten i) =>
84 | Cartesian cat ten i using Monoidal.FromPromonad where
85 | projl = funit $
applyMor projl
86 | projr = funit $
applyMor projr
87 | prod f g = Core.(.) {cat} (bimap' f g) (split {cat,ten,i})
88 | split = funit $
applyMor split
89 | elim = funit $
applyMor $
elim {ten}
91 | namespace Cocartesian
94 | [FromPromonad] {ten,i : _} -> (Promonad cat, CatEndoBifunctor cat ten, Cocartesian Morphism ten i) =>
95 | Cocartesian cat ten i using Monoidal.FromPromonad where
96 | injl = funit $
applyMor injl
97 | injr = funit $
applyMor injr
98 | coprod f g = Core.(.) {cat} (merge {cat,ten,i}) (bimap' f g)
99 | merge = funit $
applyMor merge
100 | intro = funit $
applyMor $
intro {ten}
102 | namespace Bimonoidal
105 | [FromPromonad] {add,mul,z,i : _} -> (Promonad cat, CatEndoBifunctor cat add, CatEndoBifunctor cat mul,
106 | Bimonoidal Morphism add mul z i) => Bimonoidal cat add mul z i
107 | using Monoidal.FromPromonad where
108 | distribl = funit $
applyMor distribl
109 | distribl' = funit $
applyMor distribl'
110 | distribr = funit $
applyMor distribr
111 | distribr' = funit $
applyMor distribr'
112 | absorbl = funit $
applyMor $
absorbl {add,mul}
113 | absorbl' = funit $
applyMor $
absorbl' {add,mul}
114 | absorbr = funit $
applyMor $
absorbr {add,mul}
115 | absorbr' = funit $
applyMor $
absorbr' {add,mul}
123 | Promonad Morphism where
128 | [Function] Promonad (~~>) using Category.Function where
132 | Monad m => Promonad (Kleislimorphism m) where
133 | funit f = Kleisli $
pure . f