on master help sign in
Implement Semigroup and Monoid for morphisms
93fe664howtonotwin
libs/base/Data/Morphisms.idr+13
@@ -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
30
30
31+Semigroup a => Semigroup (Morphism r a) where
32+ f <+> g = [| f <+> g |]
33+
34+Monoid a => Monoid (Morphism r a) where
35+ neutral = Mor $ const neutral
36+
31Semigroup (Endomorphism a) where
37Semigroup (Endomorphism a) where
32 (Endo f) <+> (Endo g) = Endo $ g . f
38 (Endo f) <+> (Endo g) = Endo $ g . f
33
39
@@ -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
46
52
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 |]
56+
57+(Monoid a, Applicative f) => Monoid (Kleislimorphism f r a) where
58+ neutral = Kleisli $ const $ pure neutral
59+
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
49
62