It may interest you guys to know that Ross Paterson and I have just put syntactic support for arrows into GHC. It's only in the CVS version at the moment, and is not documented at all, but those things will come. The type error messages should, I hope, be a lot better than those one can get by type checking pre-processed code.
Simon | -----Original Message----- | From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Joe | English | Sent: 28 June 2003 17:01 | To: [EMAIL PROTECTED] | Subject: Re: Arrow Classes | | | Ashley Yakeley wrote: | > Wolfgang Jeltsch wrote: | > | > > 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 | > > 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 [...] | > class (Compositor arrow) => Arrow arrow where [...] | > class (Arrow arrow) => ProductArrow arrow where [...] | > class (Arrow arrow) => CoproductArrow arrow where [...] | > class (ProductArrow arrow,CoproductArrow arrow) => FullArrow arrow | > instance (ProductArrow arrow,CoproductArrow arrow) => FullArrow arrow | > class (Arrow arrow) => ArrowFix arrow where [...] | > class (FullArrow arrow) => ApplyArrow arrow where [...] | | | On that topic, see below for what mine looks like | (from HXML, <URL: http://www.flightlab.com/~joe/hxml/ >). | | I started off with Hughes' conventions, but for some | reason could never remember the difference between &&& and ***, | or between ||| and +++. I found &&&, >&<, |||, >|< to have | better mnemonic value. This also frees up +++ for ArrowPlus, | which -- in HXML applications -- is frequently used and should | thus be easy to type. | | When using the ArrowChoice operators, I kept tripping over all | the 'Either' coproduct types, so added some syntactic sugar | (borrowed from HaXML): | | data Choice a = a :> a | class (Arrow a) => ArrowChoice a where | [ ... ] | ( ?>) :: (b -> Bool) -> Choice (a b c) -> a b c | (>?>) :: a b Bool -> Choice (a b c) -> a b c | | I found "p ?> f :> g" much more pleasant to use. | | (I also like the idea of splitting the product operators out of | the base Arrow class -- will consider doing that in my library). | | -- | | infixr 5 +++ | infixr 3 >&<, &&& | infixr 2 >|<, |||, ?>, >?>, :> | infixl 1 >>> | | class Arrow a where | arr :: (b -> c) -> a b c | (>>>) :: a b c -> a c d -> a b d | apfst :: a b c -> a (b,x) (c,x) | apsnd :: a b c -> a (x,b) (x,c) | (>&<) :: a b c -> a d e -> a (b,d) (c,e) | (&&&) :: a b c -> a b d -> a b (c,d) | liftA2 :: (b -> c -> d) -> a e b -> a e c -> a e d | aConst :: c -> a b c | idArrow :: a b b | -- Minimal implementation: arr, >>>, apfst or >&< | | data Choice a = a :> a | class (Arrow a) => ArrowChoice a where | apl :: a b c -> a (Either b d) (Either c d) | apr :: a b c -> a (Either d b) (Either d c) | (>|<) :: a b c -> a d e -> a (Either b d) (Either c e) | (|||) :: a b c -> a d c -> a (Either b d) c | ( ?>) :: (b -> Bool) -> Choice (a b c) -> a b c | (>?>) :: a b Bool -> Choice (a b c) -> a b c | -- Minimal implementation: >|< or apl | | class (Arrow a) => ArrowApply a where | app :: a (a b c,b) c | | class (Arrow a) => ArrowZero a where | aZero :: a b c | aMaybe :: a (Maybe c) c | aGuard :: (b -> Bool) -> a b b | | class (Arrow a) => ArrowPlus a where | (+++) :: a b c -> a b c -> a b c | | | | --Joe English | | [EMAIL PROTECTED] | _______________________________________________ | Haskell-Cafe mailing list | [EMAIL PROTECTED] | http://www.haskell.org/mailman/listinfo/haskell-cafe _______________________________________________ Haskell-Cafe mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell-cafe
