On Sun, Jul 15, 2012 at 1:22 PM, Ross Paterson <ross@soi.city.ac.uk> wrote: 
I propose to refactor the Arrow class, so that GHC's arrow notation can
be a bit more general.  [...]
In detail, the proposal is to change the Arrow class from [...] by introducing a new class

  class PreArrow a where
    premap :: (b -> b') -> a b' c -> a b c

There is a slightly more principled notion that offers up this operation, paired with an fmap-like operation on the second argument that is satisfied by all arrows -- a profunctor.

http://en.wikipedia.org/wiki/Profunctor
http://ncatlab.org/nlab/show/profunctor

which you can find implemented here:

http://hackage.haskell.org/packages/archive/profunctors/3.0/doc/html/Data-Profunctor.html

with misc. extras here:

http://hackage.haskell.org/package/profunctor-extras
http://hackage.haskell.org/package/representable-profunctors

Dan Piponi wrote on the connection between arrows and profunctors at the end of:

http://blog.sigfpe.com/2011/07/profunctors-in-haskell.html

If we are going to introduce another superclass, I would much rather introduce that one, as it has a better theoretical motivation and the additional laws regarding dinatural transformations and the extra structure that follows. 

For instance, profunctor composition is both well defined and useful (as are profunctor collages and traces, and there is also a useful notion of representability for profunctors).

http://hackage.haskell.org/packages/archive/profunctor-extras/3.0/doc/html/Data-Profunctor-Composition.html

-Edward Kmett