Arrow combines two concepts. One of them, as you say, is a professor, but first of all it is only a certain class of categories (like the proof of a superclass).
This is very important for this question: yes, the signature fmap is equal to (a -> b) -> fa -> fb , but in fact it is not a complete generality of what the functor can do! In mathematics, a functor is a mapping between two categories C and D, which assigns to each arrow in C the arrow in D. Arrows in different categories, that is! The standard Functor class simply captures the simplest special case - endofunctors in the Hask category.
The full general version of the functor class is more like this (here is my version from the restricted categories ):
class (Category r, Category t) => Functor frt | fr -> t, ft -> r where fmap :: rab -> t (fa) (fb)
Or, in pseudo-syntax,
class (Category (ββ>), Category (~>)) => Functor f (ββ>) (~>) where fmap :: (a ββ> b) -> fa ~> fb
It can also be justified if one of the categories is the right arrow, and not the usual category of functions. For example, you can define
instance Functor Maybe (Kleisli [] (->)) (Kleisli [] (->)) where fmap (Kleisli f) = Kleisli mf where mf Nothing = [Nothing] mf (Just a) = Just <$> fa
to be used as
> runKleisli (fmap . Kleisli $ \i -> [0..i]) $ Nothing [Nothing] > runKleisli (fmap . Kleisli $ \i -> [0..i]) $ Just 4 [Just 0,Just 1,Just 2,Just 3,Just 4]
Not sure if this would be useful for something non-trivial if you use standard arrow-finances. This is definitely useful in other categories that are not Hask -profunctors, e.g.
instance (TensorSpace v) => Functor (Tensor sv) (LinearFunction s) (LinearFunction s)
expressing that you can display a linear function by one coefficient of the tensor product (whereas it is generally impossible to display a nonlinear function over such a product - the result will depend on the choice of a basis on the vector space).