
In article <200306271927.36405.wolfgang@jeltsch.net>,
Wolfgang Jeltsch
This brings me to another point. One year ago we had a discussion on The Haskell Mailing List concerning arrows. (The subject of the mails was just "arrows".) The point was that it seemed strange to me that first and second are included in the basic arrow class Arrow while left and right have their extra class ArrowChoice. Not only that it seemed strange to me but it made it impossible to make Parser baseMonad an instance of Arrow. Parser baseMonad has nice implementations of pure and (>>>) but none of first or second.
I agree. My own Arrow module hierarchy looks more or less like this: class Compositor comp where identity :: comp a a compose :: comp b c -> comp a b -> comp a c class (Compositor arrow) => Arrow arrow where arrFunction :: (p -> q) -> arrow p q -- | corresponds to Hughes\' \'Arrow\' class (Arrow arrow) => ProductArrow arrow where arrApply :: arrow p (q -> r) -> arrow p q -> arrow p r arrProduct :: arrow p q -> arrow p r -> arrow p (q,r) arrProduct = liftA2 (,) class (Arrow arrow) => CoproductArrow arrow where arrCoproduct :: arrow p r -> arrow q r -> arrow (Either p q) r -- | corresponds to Hughes\' \'ArrowChoice\' class (ProductArrow arrow,CoproductArrow arrow) => FullArrow arrow instance (ProductArrow arrow,CoproductArrow arrow) => FullArrow arrow class (Arrow arrow) => ArrowFix arrow where arrFix :: arrow (p,q) q -> arrow p q class (FullArrow arrow) => ApplyArrow arrow where arrApplyArrow :: arrow (arrow p q,p) q Note the symmetry between ProductArrow and CoproductArrow. See <http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/hbase/Source/H Base/Category/Arrow.hs?rev=HEAD&content-type=text/plain> for all the details. -- Ashley Yakeley, Seattle WA