@@ -5,8 +5,11 @@ import Control.Category
6%access public
6%access public
8infixr 3 ***
9infixr 3 ***
9infixr 3 &&&
10infixr 3 &&&
11class Category arr => Arrow (arr : Type -> Type -> Type) where
14class Category arr => Arrow (arr : Type -> Type -> Type) where
12 arrow : (a -> b) -> arr a b
15 arrow : (a -> b) -> arr a b
@@ -37,3 +40,56 @@ instance Monad m => Arrow (Kleislimorphism m) where
37 (Kleisli f) &&& (Kleisli g) = Kleisli $ \a => do x <- f a
40 (Kleisli f) &&& (Kleisli g) = Kleisli $ \a => do x <- f a
39 return (x, y)
42 return (x, y)
44+class Arrow arr => ArrowZero (arr : Type -> Type -> Type) where
47+class ArrowZero arr => ArrowPlus (arr : Type -> Type -> Type) where
48+ (<#>) : arr a b -> arr a b -> arr a b
50+class Arrow arr => ArrowChoice (arr : Type -> Type -> Type) where
51+ left : arr a b -> arr (Either a c) (Either b c)
53+ right : arr a b -> arr (Either c a) (Either c b)
54+ right f = arrow swap >>> left f >>> arrow swap where
55+ swap : Either a b -> Either b a
56+ swap (Left x) = Right x
57+ swap (Right x) = Left x
59+ (+++) : arr a b -> arr c d -> arr (Either a c) (Either b d)
60+ f +++ g = left f >>> right g
62+ (\|/) : arr a b -> arr c b -> arr (Either a c) b
63+ f \|/ g = f +++ g >>> arrow fromEither
65+instance Monad m => ArrowChoice (Kleislimorphism m) where
66+ left f = f +++ (arrow id)
67+ right f = (arrow id) +++ f
68+ f +++ g = (f >>> (arrow Left)) \|/ (g >>> (arrow Right))
69+ (Kleisli f) \|/ (Kleisli g) = Kleisli (either f g)
71+class Arrow arr => ArrowApply (arr : Type -> Type -> Type) where
72+ app : arr (arr a b, a) b
74+instance Monad m => ArrowApply (Kleislimorphism m) where
75+ app = Kleisli $ \(Kleisli f, x) => f x
77+data ArrowMonad : (Type -> Type -> Type) -> Type -> Type where
78+ MkArrowMonad : (runArrowMonad : arr (the Type ()) a) -> ArrowMonad arr a
80+runArrowMonad : ArrowMonad arr a -> arr (the Type ()) a
81+runArrowMonad (MkArrowMonad a) = a
83+instance Arrow a => Functor (ArrowMonad a) where
84+ map f (MkArrowMonad m) = MkArrowMonad $ m >>> arrow f
86+instance Arrow a => Applicative (ArrowMonad a) where
87+ pure x = MkArrowMonad $ arrow $ \_ => x
88+ (MkArrowMonad f) <$> (MkArrowMonad x) = MkArrowMonad $ f &&& x >>> arrow (uncurry id)
90+instance ArrowApply a => Monad (ArrowMonad a) where
91+ (MkArrowMonad m) >>= f =
92+ MkArrowMonad $ m >>> (arrow $ \x => (runArrowMonad (f x), ())) >>> app
94+class Arrow arr => ArrowLoop (arr : Type -> Type -> Type) where
95+ loop : arr (Pair a c) (Pair b c) -> arr a b