0 | module Control.Category.Functor
2 | import Control.Category.Core
3 | import Data.Morphisms
23 | interface CatFunctor
26 | (0 f : obj -> obj') | cat,cat',f where
27 | constructor MkCatFunctor
29 | map : {a,b : _} -> cat a b -> cat' (f a) (f b)
37 | CatEndofunctor : (cat : Hom obj) -> (f : obj -> obj) -> Type
38 | CatEndofunctor cat f = CatFunctor cat cat f
43 | map' : CatEndofunctor cat f => {a,b : _} -> cat a b -> cat (f a) (f b)
58 | interface CatBifunctor
62 | (0 f : objA -> objB -> obj') | catA,catB,cat',f where
63 | constructor MkCatBifunctor
66 | bimap : {a,a',b,b' : _} -> catA a b -> catB a' b' -> cat' (f a a') (f b b')
81 | Binoidal : (catA : Hom objA) -> (catB : Hom objB) -> (cat' : Hom obj') ->
82 | (f : objA -> objB -> obj') -> Type
83 | Binoidal = CatBifunctor
87 | mapl : CatBifunctor catA catB cat' f => Category catB =>
88 | {a,b,c : _} -> catA a b -> cat' (f a c) (f b c)
89 | mapl m = bimap {catA,catB,cat',f} m id
93 | mapr : CatBifunctor catA catB cat' f => Category catA =>
94 | {a,b,c : _} -> catB a b -> cat' (f c a) (f c b)
95 | mapr = bimap {catA,catB,cat',f} id
104 | CatEndoBifunctor : (cat : Hom obj) -> (f : obj -> obj -> obj) -> Type
105 | CatEndoBifunctor cat f = CatBifunctor cat cat cat f
109 | EndoBinoidal : (cat : Hom obj) -> (f : obj -> obj -> obj) -> Type
110 | EndoBinoidal = CatEndoBifunctor
116 | bimap' : CatEndoBifunctor cat f => {a,a',b,b' : _} ->
117 | cat a b -> cat a' b' -> cat (f a a') (f b b')
118 | bimap' = bimap {catA=cat,catB=cat,cat'=cat}
123 | mapl' : CatEndoBifunctor cat f => Category cat =>
124 | {a,b,c : _} -> cat a b -> cat (f a c) (f b c)
125 | mapl' = mapl {catA=cat,catB=cat,cat'=cat}
130 | mapr' : CatEndoBifunctor cat f => Category cat => {a,b,c : _} ->
131 | cat a b -> cat (f c a) (f c b)
132 | mapr' = mapr {catA=cat,catB=cat,cat'=cat}
139 | namespace CatFunctor
142 | [Compose] {g : _} -> CatFunctor cat' cat'' f => CatFunctor cat cat' g =>
143 | CatFunctor cat cat'' (Prelude.(.) f g) where
144 | map = map {cat=cat',cat'=cat'',f} . map {cat,cat',f=g}
148 | [Id] CatFunctor cat cat Prelude.id where
154 | [Const] {x : _} -> Category cat' => CatFunctor cat cat' (const x) where
157 | namespace CatBifunctor
160 | [Left] {r : _} -> CatBifunctor catA catB cat' f => Category catB =>
161 | CatFunctor catA cat' (`f` r) where
162 | map = mapl {catA,catB,cat'}
166 | [Right] {l : _} -> CatBifunctor catA catB cat' f => Category catA =>
167 | CatFunctor catB cat' (l `f`) where
168 | map = mapr {catA,catB,cat'}
172 | [Compose] {g : _} -> CatFunctor cat' cat'' f => CatBifunctor catA catB cat' g =>
173 | CatBifunctor catA catB cat'' (f .: g) where
174 | bimap = map {cat=cat',cat'=cat'',f} .: bimap {catA,catB,cat',f=g}
181 | namespace CatFunctor
185 | [MorFromFunctor] Functor f => CatFunctor Morphism Morphism f where
186 | map (Mor f) = Mor (map f)
191 | [FuncFromFunctor] Functor f => CatFunctor (~~>) (~~>) f where
197 | [KleisliFromTraversable] (Traversable f, Applicative m) =>
198 | CatFunctor (Kleislimorphism m) (Kleislimorphism m) f where
199 | map (Kleisli f) = Kleisli $
traverse f
201 | namespace CatBifunctor
205 | [MorFromBifunctor] Bifunctor f => CatBifunctor Morphism Morphism Morphism f where
206 | bimap (Mor f) (Mor g) = Mor (bimap f g)
211 | [FuncFromBifunctor] Bifunctor f => CatBifunctor (~~>) (~~>) (~~>) f where
212 | bimap = Prelude.bimap
222 | [KleisliFromBitraversable] (Applicative m, Bitraversable f) =>
223 | CatBifunctor (Kleislimorphism m)
224 | (Kleislimorphism m)
225 | (Kleislimorphism m) f where
226 | bimap (Kleisli f) (Kleisli g) = Kleisli $
bitraverse f g
228 | public export %hint
229 | CatBifunctorMorPair : CatEndoBifunctor Morphism Pair
230 | CatBifunctorMorPair = MorFromBifunctor
232 | public export %hint
233 | CatBifunctorMorEither : CatEndoBifunctor Morphism Either
234 | CatBifunctorMorEither = MorFromBifunctor
237 | public export %hint
238 | CatBifunctorKleisliPair : Applicative m => EndoBinoidal (Kleislimorphism m) Pair
239 | CatBifunctorKleisliPair = KleisliFromBitraversable
241 | public export %hint
242 | CatBifunctorKleisliEither : Applicative m => CatEndoBifunctor (Kleislimorphism m) Either
243 | CatBifunctorKleisliEither = KleisliFromBitraversable