on master help sign in
Add Functor, Applicative, and Monad instances for Kleislimorphism
7c04687howtonotwin
libs/base/Data/Morphisms.idr+10
@@ -34,6 +34,16 @@ Semigroup (Endomorphism a) where
34Monoid (Endomorphism a) where
34Monoid (Endomorphism a) where
35 neutral = Endo id
35 neutral = Endo id
36
36
37+Functor f => Functor (Kleislimorphism f a) where
38+ map f (Kleisli g) = Kleisli (map f . g)
39+
40+Applicative f => Applicative (Kleislimorphism f a) where
41+ pure a = Kleisli $ const $ pure a
42+ (Kleisli f) <*> (Kleisli a) = Kleisli $ \r => f r <*> a r
43+
44+Monad f => Monad (Kleislimorphism f a) where
45+ (Kleisli f) >>= g = Kleisli $ \r => applyKleisli (g !(f r)) r
46+
37Cast (Endomorphism a) (Morphism a a) where
47Cast (Endomorphism a) (Morphism a a) where
38 cast (Endo f) = Mor f
48 cast (Endo f) = Mor f
39
49