# Arrow Classes

**Ashley Yakeley
**
ashley@semantic.org

*Thu, 10 Jul 2003 22:34:45 -0700*

In article <20030710133324.GA2318@soi.city.ac.uk>,
Ross Paterson <ross@soi.city.ac.uk> wrote:
>* As it happens, I would like yet another intermediate class:
*>*
*>* class BiFunctor a where
*>* bimap :: (b' -> b) -> (c -> c') -> a b c -> a b' c'
*
This can be decomposed into:
fmap :: (c -> c') -> a b c -> a b c'
cofmap2 :: (b' -> b) -> a b c -> a b' c
bimap :: (Cofunctor2 a,Functor (a b)) =>
(b' -> b) -> (c -> c') -> a b c -> a b' c'
bimap bb cc = (cofmap2 bb) . (fmap cc)
It would be nice to be able to write this:
class (Cofunctor2 a,forall b. Functor (a b)) =>
BiFunctor a
instance (Cofunctor2 a,forall b. Functor (a b)) =>
BiFunctor a
Unfortunately, foralls are not allowed in class or instance contexts...
--
Ashley Yakeley, Seattle WA