2 | import Control.Category
4 | import Data.Morphisms
14 | interface Category arr => Arrow (0 arr : Type -> Type -> Type) where
16 | arrow : (a -> b) -> arr a b
20 | first : arr a b -> arr (a, c) (b, c)
24 | second : arr a b -> arr (c, a) (c, b)
25 | second f = arrow {arr = arr} swap >>> first f >>> arrow {arr = arr} swap
27 | swap : (x, y) -> (y, x)
28 | swap (a, b) = (b, a)
30 | (***) : arr a b -> arr a' b' -> arr (a, a') (b, b')
31 | f *** g = first f >>> second g
33 | (&&&) : arr a b -> arr a b' -> arr a (b, b')
34 | f &&& g = arrow dup >>> f *** g
37 | implementation Arrow Morphism where
39 | first (Mor f) = Mor $
\(a, b) => (f a, b)
40 | second (Mor f) = Mor $
\(a, b) => (a, f b)
41 | (Mor f) *** (Mor g) = Mor $
\(a, b) => (f a, g b)
42 | (Mor f) &&& (Mor g) = Mor $
\a => (f a, g a)
45 | implementation Monad m => Arrow (Kleislimorphism m) where
46 | arrow f = Kleisli (pure . f)
47 | first (Kleisli f) = Kleisli $
\(a, b) => do x <- f a
50 | second (Kleisli f) = Kleisli $
\(a, b) => do x <- f b
53 | (Kleisli f) *** (Kleisli g) = Kleisli $
\(a, b) => do x <- f a
57 | (Kleisli f) &&& (Kleisli g) = Kleisli $
\a => do x <- f a
62 | interface Arrow arr => ArrowZero (0 arr : Type -> Type -> Type) where
66 | interface ArrowZero arr => ArrowPlus (0 arr : Type -> Type -> Type) where
67 | (<++>) : arr a b -> arr a b -> arr a b
70 | interface Arrow arr => ArrowChoice (0 arr : Type -> Type -> Type) where
71 | left : arr a b -> arr (Either a c) (Either b c)
73 | right : arr a b -> arr (Either c a) (Either c b)
74 | right f = arrow mirror >>> left f >>> arrow mirror
77 | (+++) : arr a b -> arr c d -> arr (Either a c) (Either b d)
78 | f +++ g = left f >>> right g
80 | (\|/) : arr a b -> arr c b -> arr (Either a c) b
81 | f \|/ g = f +++ g >>> arrow fromEither
84 | implementation Monad m => ArrowChoice (Kleislimorphism m) where
85 | left f = f +++ (arrow id)
86 | right f = (arrow id) +++ f
87 | f +++ g = (f >>> (arrow Left)) \|/ (g >>> (arrow Right))
88 | (Kleisli f) \|/ (Kleisli g) = Kleisli (either f g)
91 | interface Arrow arr => ArrowApply (0 arr : Type -> Type -> Type) where
92 | app : arr (arr a b, a) b
95 | implementation Monad m => ArrowApply (Kleislimorphism m) where
96 | app = Kleisli $
\(Kleisli f, x) => f x
99 | data ArrowMonad : (Type -> Type -> Type) -> Type -> Type where
100 | MkArrowMonad : (runArrowMonad : arr Unit a) -> ArrowMonad arr a
103 | runArrowMonad : ArrowMonad arr a -> arr Unit a
104 | runArrowMonad (MkArrowMonad a) = a
107 | implementation Arrow a => Functor (ArrowMonad a) where
108 | map f (MkArrowMonad m) = MkArrowMonad $
m >>> arrow f
111 | implementation Arrow a => Applicative (ArrowMonad a) where
112 | pure x = MkArrowMonad $
arrow $
\_ => x
113 | (MkArrowMonad f) <*> (MkArrowMonad x) = MkArrowMonad $
f &&& x >>> arrow (uncurry id)
116 | implementation ArrowApply a => Monad (ArrowMonad a) where
117 | (MkArrowMonad m) >>= f =
118 | MkArrowMonad $
m >>> (arrow $
\x => (runArrowMonad (f x), ())) >>> app
121 | interface Arrow arr => ArrowLoop (0 arr : Type -> Type -> Type) where
122 | loop : arr (Pair a c) (Pair b c) -> arr a b
126 | liftA2 : Arrow arr => (a -> b -> c) -> arr d a -> arr d b -> arr d c
127 | liftA2 op f g = (f &&& g) >>> arrow (\(a, b) => a `op` b)