@@ -15,9 +15,25 @@ class Category arr => Arrow (arr : Set -> Set -> Set) where
15 (***) : arr a b -> arr a' b' -> arr (a, a') (b, b')
15 (***) : arr a b -> arr a' b' -> arr (a, a') (b, b')
16 (&&&) : arr a b -> arr a b' -> arr a (b, b')
16 (&&&) : arr a b -> arr a b' -> arr a (b, b')
18−instance Arrow Morphism where
18+instance Arrow Homomorphism where
19 arrow f = Homo f
19 arrow f = Homo f
20 first (Homo f) = Homo $ \(a, b) => (f a, b)
20 first (Homo f) = Homo $ \(a, b) => (f a, b)
21 second (Homo f) = Homo $ \(a, b) => (a, f b)
21 second (Homo f) = Homo $ \(a, b) => (a, f b)
22 (Homo f) *** (Homo g) = Homo $ \(a, b) => (f a, g b)
22 (Homo f) *** (Homo g) = Homo $ \(a, b) => (f a, g b)
23 (Homo f) &&& (Homo g) = Homo $ \a => (f a, g a)
23 (Homo f) &&& (Homo g) = Homo $ \a => (f a, g a)
25+instance Monad m => Arrow (Kleislimorphism m) where
26+ arrow f = Kleisli (return . f)
27+ first (Kleisli f) = Kleisli $ \(a, b) => do x <- f a
30+ second (Kleisli f) = Kleisli $ \(a, b) => do x <- f b
33+ (Kleisli f) *** (Kleisli g) = Kleisli $ \(a, b) => do x <- f a
37+ (Kleisli f) &&& (Kleisli g) = Kleisli $ \a => do x <- f a