@@ -28,6 +28,12 @@ Applicative (Morphism r) where
28Monad (Morphism r) where
28Monad (Morphism r) where
29 (Mor h) >>= f = Mor $ \r => applyMor (f $ h r) r
29 (Mor h) >>= f = Mor $ \r => applyMor (f $ h r) r
31+Semigroup a => Semigroup (Morphism r a) where
32+ f <+> g = [| f <+> g |]
34+Monoid a => Monoid (Morphism r a) where
35+ neutral = Mor $ const neutral
31Semigroup (Endomorphism a) where
37Semigroup (Endomorphism a) where
32 (Endo f) <+> (Endo g) = Endo $ g . f
38 (Endo f) <+> (Endo g) = Endo $ g . f
@@ -44,6 +50,13 @@ Applicative f => Applicative (Kleislimorphism f a) where
44Monad f => Monad (Kleislimorphism f a) where
50Monad f => Monad (Kleislimorphism f a) where
45 (Kleisli f) >>= g = Kleisli $ \r => applyKleisli (g !(f r)) r
51 (Kleisli f) >>= g = Kleisli $ \r => applyKleisli (g !(f r)) r
53+-- Applicative is a bit too strong, but there is no suitable superclass
54+(Semigroup a, Applicative f) => Semigroup (Kleislimorphism f r a) where
55+ f <+> g = [| f <+> g |]
57+(Monoid a, Applicative f) => Monoid (Kleislimorphism f r a) where
58+ neutral = Kleisli $ const $ pure neutral
47Cast (Endomorphism a) (Morphism a a) where
60Cast (Endomorphism a) (Morphism a a) where
48 cast (Endo f) = Mor f
61 cast (Endo f) = Mor f