class (GArrow g (**) u,
GArrow g (<+>) v) =>
GArrowSum g (**) u v (<+>) where
- ga_merge :: g (x**x) x
- ga_never :: g v x
+ ga_merge :: g (x<+>x) x
+ ga_never :: g v x
ga_applyr :: g ( (x~>y)**x) y
class GArrow g (**) u => GArrowCurry g (**) u (~>) where
- ga_curryl :: g x (y**(x~>y) )
- ga_curryr :: g x ( (x~>y)**y)
+ ga_curryl :: g (x**y) z -> g x (y~>z)
+ ga_curryr :: g (x**y) z -> g y (x~>z)