ga_applyl = ga_swap >>> app
ga_applyr = app
-instance Arrow a => GArrowProd a (,) () (,) () where
- ga_prod_drop = arr (\x -> ())
- ga_prod_copy = arr (\x -> (x,x))
+instance Arrow a => GArrowProd a (,) () where
-- The uninhabited type
data Void
eitherUnAssoc (Right (Left y)) = Left (Right y)
eitherUnAssoc (Right (Right z)) = Right z
-instance ArrowChoice a => GArrowSum a (,) () Either Void where
+instance ArrowChoice a => GArrowSum a Either Void where
ga_never = arr voidImpossible
ga_merge = arr merge
where
-- Products, Coproducts, etc
-class (GArrow g (**) u,
- GArrow g (<*>) v) =>
- GArrowProd g (**) u (<*>) v
-
- -- fundep: in any given context, (<*>) may serve as the
- -- product for at most one GArrow
- | (**) -> (<*>),
- (<*>) -> v, v -> (<*>) where
- ga_prod_copy :: g x (x<*>x)
- ga_prod_drop :: g x v
-
-class (GArrow g (**) u,
- GArrow g (<+>) v) =>
- GArrowSum g (**) u (<+>) v
-
- -- fundep: in any given context, (<+>) may serve as the
- -- coproduct for at most one GArrow
- | (<+>) -> (**),
- (<+>) -> v, v -> (<+>) where
+class (GArrowDrop g (<*>) u,
+ GArrowCopy g (<*>) u) =>
+ GArrowProd g (<*>) u
+
+class GArrow g (<+>) u =>
+ GArrowSum g (<+>) u where
ga_merge :: g (x<+>x) x
- ga_never :: g v x
+ ga_never :: g u x
--- Note to self: do not remove this type declaration; it ensures that if
--- I fiddle with the GArrowSum fundeps and get them wrong (i.e. insufficient)
--- I'll find out about it when compiling the base library.
-ga_inl :: GArrowSum g (**) u (<+>) v => g x (x<+>y)
+ga_inl :: GArrowSum g (<+>) u => g x (x<+>y)
ga_inl = ga_uncancelr >>> ga_second ga_never
-ga_inr :: GArrowSum g (**) u (<+>) v => g x (y<+>x)
+ga_inr :: GArrowSum g (<+>) u => g x (y<+>x)
ga_inr = ga_uncancell >>> ga_first ga_never