@@ -1,22 +1,42 @@
11module Data.Morphisms
22
3+import Builtins
4+
35%access public
46
5−data Morphism : Set -> Set -> Set where
6− Homo : (a -> b) -> Morphism a b
7+data Homomorphism : Set -> Set -> Set where
8+ Homo : (a -> b) -> Homomorphism a b
9+
10+data Endomorphism : Set -> Set where
11+ Endo : (a -> a) -> Endomorphism a
12+
13+data Kleislimorphism : (Set -> Set) -> Set -> Set -> Set where
14+ Kleisli : Monad m => (a -> m b) -> Kleislimorphism m a b
15+
16+applyKleisli : Monad m => (Kleislimorphism m a b) -> a -> m b
17+applyKleisli (Kleisli f) a = f a
718
8−($) : Morphism a b -> a -> b
9−(Homo f) $ a = f a
19+applyHomo : Homomorphism a b -> a -> b
20+applyHomo (Homo f) a = f a
1021
11−instance Monad (Morphism r) where
22+applyEndo : Endomorphism a -> a -> a
23+applyEndo (Endo f) a = f a
24+
25+instance Monad (Homomorphism r) where
1226 return a = Homo $ const a
13− (Homo h) >>= f = Homo $ \r => f (h r) $ r
27+ (Homo h) >>= f = Homo $ \r => applyHomo (f $ h r) r
1428
15−instance Applicative (Morphism r) where
29+instance Applicative (Homomorphism r) where
1630 pure a = Homo $ const a
1731 (Homo f) <$> (Homo a) = Homo $ \r => f r $ a r
1832
33+instance Semigroup (Endomorphism a) where
34+ (Endo f) <+> (Endo g) = Endo $ g . f
35+
36+instance Monoid (Endomorphism a) where
37+ neutral = Endo id
38+
1939infixr 1 ~>
2040
2141(~>) : Set -> Set -> Set
22−a ~> b = Morphism a b
42+a ~> b = Homomorphism a b