0 | module Control.Category.Monad
2 | import Control.Category.Core
3 | import Control.Category.Functor
4 | import Control.Category.Monoidal
5 | import Data.Morphisms
26 | interface CatFunctor cat cat m => CatMonad
28 | (0 m : obj -> obj) | cat,m where
29 | constructor MkCatMonad
31 | join : {a : _} -> cat (m (m a)) (m a)
33 | unit : {a : _} -> cat a (m a)
54 | interface CatFunctor cat cat f => StrongFunctor
56 | (0 ten : obj -> obj -> obj)
57 | (0 f : obj -> obj) | cat,ten,f where
58 | constructor MkStrongFunctor
60 | strongl : {a,b : _} -> cat (a `ten` f b) (f $
a `ten` b)
62 | strongr : {a,b : _} -> cat (f a `ten` b) (f $
a `ten` b)
73 | StrongMonad : (cat : Hom obj) -> (ten : obj -> obj -> obj) -> (m : obj -> obj) -> Type
74 | StrongMonad cat ten m = (CatMonad cat m, StrongFunctor cat ten m)
88 | [MorFromMonad] Monad m => CatMonad Morphism m
89 | using CatFunctor.MorFromFunctor where
96 | [FuncFromMonad] Monad m => CatMonad (~~>) m
97 | using CatFunctor.FuncFromFunctor where
101 | namespace StrongFunctor
105 | [MorFromFunctor] Functor f => StrongFunctor Morphism Pair f
106 | using CatFunctor.MorFromFunctor where
107 | strongl = Mor $
\(x,y) => map (x,) y
108 | strongr = Mor $
\(x,y) => map (,y) x
113 | [FuncFromFunctor] Functor m => StrongFunctor (~~>) Pair m
114 | using CatFunctor.FuncFromFunctor where
115 | strongl (x,y) = map (x,) y
116 | strongr (x,y) = map (,y) x
118 | namespace StrongMonad
121 | MorFromMonad : Monad m => Bitraversable ten => StrongMonad Morphism ten m
122 | MorFromMonad = (MorFromMonad,
123 | MkStrongFunctor @{MorFromFunctor}
124 | (Mor $
bitraverse pure id)
125 | (Mor $
bitraverse id pure))
130 | FuncFromMonad : Monad m => Bitraversable ten => StrongMonad (~~>) ten m
131 | FuncFromMonad = (FuncFromMonad,
132 | MkStrongFunctor @{FuncFromFunctor}
133 | (bitraverse pure id)
134 | (bitraverse id pure))