1 {-# OPTIONS -XRankNTypes -XMultiParamTypeClasses -XNoMonomorphismRestriction -XTypeOperators -XFlexibleInstances #-}
2 -----------------------------------------------------------------------------
4 -- Module : GHC.HetMet.GArrow
6 -- License : public domain
8 -- Maintainer : Adam Megacz <megacz@acm.org>
9 -- Stability : experimental
10 -- Portability : portable
12 module GHC.HetMet.GArrow (
22 import Control.Category
24 class GArrow g (**) where
26 ga_comp :: g x y -> g y z -> g x z
27 ga_first :: g x y -> g (x ** z) (y ** z)
28 ga_second :: g x y -> g (z ** x) (z ** y)
29 ga_cancell :: g (()**x) x
30 ga_cancelr :: g (x**()) x
31 ga_uncancell :: g x (()**x)
32 ga_uncancelr :: g x (x**())
33 ga_assoc :: g ((x**y)**z) (x**(y**z))
34 ga_unassoc :: g (x**(y**z)) ((x**y)**z)
36 class GArrow g (**) => GArrowDrop g (**) where
39 class GArrow g (**) => GArrowCopy g (**) where
42 class GArrow g (**) => GArrowSwap g (**) where
43 ga_swap :: g (x**y) (y**x)
45 -- implementation of ga_second for GArrowSwap instances
46 ga_swap_second f = ga_comp (ga_comp ga_swap (ga_first f)) ga_swap
48 class GArrow g (**) => GArrowLoop g (**) where
49 ga_loop :: g (x**z) (y**z) -> g x y
51 class GArrow g (**) => GArrowLiteral g (**) a where
52 ga_literal :: a -> g () a
54 -- not sure -- subject to change
55 class GArrow g (**) => GArrowReify g (**) where
56 ga_reify :: (x -> y) -> g x y
58 -- not sure -- subject to change
59 class GArrow g (**) => GArrowReflect g (**) where
60 ga_reflect :: g x y -> (x -> y)
64 ------------------------------------------------------------------------------
65 -- GArrow instances for Control.Arrow
67 instance Arrow a => GArrow a (,) where
68 ga_id = arr Prelude.id
72 ga_cancell = arr (\((),x) -> x)
73 ga_cancelr = arr (\(x,()) -> x)
74 ga_uncancell = arr (\x -> ((),x))
75 ga_uncancelr = arr (\x -> (x,()))
76 ga_assoc = arr (\((x,y),z) -> (x,(y,z)))
77 ga_unassoc = arr (\(x,(y,z)) -> ((x,y),z))
79 instance Arrow a => GArrowDrop a (,) where
80 ga_drop = arr (\x -> ())
82 instance Arrow a => GArrowCopy a (,) where
83 ga_copy = arr (\x -> (x,x))
85 instance Arrow a => GArrowSwap a (,) where
86 ga_swap = arr (\(x,y) -> (y,x))
88 instance Arrow a => GArrowLiteral a (,) where
89 ga_literal x = arr (\() -> x)
91 instance Arrow a => GArrowReify a (,) where
94 instance ArrowLoop a => GArrowLoop a (,) where
100 ------------------------------------------------------------------------------
101 -- Category instance for GArrow
103 instance GArrow g => Category g where