This answer from a Category Theory perspective includes the following statement:
...the truth is that there's no real distinction between co and contravariant functor, because every functor is just a covariant functor.
...
More in details a contravariant functor F from a category C to a category D is nothing more than a (covariant) functor of type F : Cop→D, from the opposite category of C to the category D.
On the other hand, Haskell's Functor and Contravariant merely require fmap and contramap, respectively, to be defined for an instance. This suggests that, from the perspective of Haskell, there exists objects that are Contravariant but are not Functors (and vice versa).
So it seems that in Category Theory "there's no real distinction between co and contravariant functors" while in Haskell there is a distinction between Contravariant and Functor.
I suspect that this difference has something to with all implementation in Haskell happening in Hask, but I'm not sure.
I think I understand each of the Category Theory and Haskell perspectives on their own, but I'm struggling to find an intuition that connects the two.
FunctorandContravariantare not "the same" in Haskell is probably just because the opposite category to Hask (one in which a morphism fromatobis represented by a function of typeb -> a) is just not something that's particularly natural to think about. This is because Haskell is really all about just one category, and functors are endofunctors on Hask, whereas mathematical category theory is about the relationships (ie. functors between) all sorts of different categories (which are individually important in their own right). - Robin ZigmondContravarianttypeclass, though, than it is to define Haskell<sup>OP</sup>. - chepner