-pga_id :: PGArrow x x
-pga_id = PGArrow { unG = Control.Category.id }
-pga_comp :: forall x y z. PGArrow x y -> PGArrow y z -> PGArrow x z
-pga_comp f g = PGArrow { unG = unG f >>> unG g }
-pga_first :: PGArrow x y -> PGArrow (x , z) (y , z)
-pga_first f = PGArrow { unG = ga_first $ unG f }
-pga_second :: PGArrow x y -> PGArrow (z , x) (z , y)
-pga_second f = PGArrow { unG = ga_second $ unG f }
-pga_cancell :: PGArrow ((),x) x
-pga_cancell = PGArrow { unG = ga_cancell }
-pga_cancelr :: PGArrow (x,()) x
-pga_cancelr = PGArrow { unG = ga_cancelr }
-pga_uncancell :: PGArrow x ((),x)
-pga_uncancell = PGArrow { unG = ga_uncancell }
-pga_uncancelr :: PGArrow x (x,())
-pga_uncancelr = PGArrow { unG = ga_uncancelr }
-pga_assoc :: PGArrow ((x, y),z ) ( x,(y ,z))
-pga_assoc = PGArrow { unG = ga_assoc }
-pga_unassoc :: PGArrow ( x,(y ,z)) ((x, y),z )
-pga_unassoc = PGArrow { unG = ga_unassoc }
-pga_copy :: PGArrow x (x,x)
-pga_copy = PGArrow { unG = ga_copy }
-pga_drop :: PGArrow x ()
-pga_drop = PGArrow { unG = ga_drop }
-pga_swap :: PGArrow (x,y) (y,x)
-pga_swap = PGArrow { unG = ga_swap }
-pga_applyl :: PGArrow (x,(x->y) ) y
+pga_id :: forall g x. PGArrow g x x
+pga_id = PGArrowD { unG = Control.Category.id }
+pga_comp :: forall g x y z. PGArrow g x y -> PGArrow g y z -> PGArrow g x z
+pga_comp f g = PGArrowD { unG = unG f >>> unG g }
+pga_first :: forall g x y z . PGArrow g x y -> PGArrow g (x , z) (y , z)
+pga_first f = PGArrowD { unG = ga_first $ unG f }
+pga_second :: forall g x y z . PGArrow g x y -> PGArrow g (z , x) (z , y)
+pga_second f = PGArrowD { unG = ga_second $ unG f }
+pga_cancell :: forall g x . PGArrow g ((),x) x
+pga_cancell = PGArrowD { unG = ga_cancell }
+pga_cancelr :: forall g x . PGArrow g (x,()) x
+pga_cancelr = PGArrowD { unG = ga_cancelr }
+pga_uncancell :: forall g x . PGArrow g x ((),x)
+pga_uncancell = PGArrowD { unG = ga_uncancell }
+pga_uncancelr :: forall g x . PGArrow g x (x,())
+pga_uncancelr = PGArrowD { unG = ga_uncancelr }
+pga_assoc :: forall g x y z . PGArrow g ((x, y),z ) ( x,(y ,z))
+pga_assoc = PGArrowD { unG = ga_assoc }
+pga_unassoc :: forall g x y z . PGArrow g ( x,(y ,z)) ((x, y),z )
+pga_unassoc = PGArrowD { unG = ga_unassoc }
+pga_copy :: forall g x . PGArrow g x (x,x)
+pga_copy = PGArrowD { unG = ga_copy }
+pga_drop :: forall g x . PGArrow g x ()
+pga_drop = PGArrowD { unG = ga_drop }
+pga_swap :: forall g x y . PGArrow g (x,y) (y,x)
+pga_swap = PGArrowD { unG = ga_swap }
+pga_applyl :: forall g x y . PGArrow g (x,(x->y) ) y