It is important to understand that it is not (a,a) that would be a functor, in the same way that Maybe a and [a] are not functors. Instead, Maybe and [] functors.
A full explanation requires the introduction of the concept of species, which are similar to "type types". Any particular type has the form * . A type constructor of type Maybe or [] takes a type and returns another type, so it has the form * -> * .
What type (,) (constructor for pairs)? This requires two types: one for the first slot and the second for the second slot, so it has the form * -> * -> * .
You can only make a functor from things like * -> * , so the short answer to your question is no, you cannot do (,) in a functor.
However, you can get around the restriction by wrapping the type. for instance
newtype Pair a = P (a,a) instance Functor Pair where fmap f (P (x,y)) = P (fx, fy)
The newtype shell will be optimized by the compiler, so it will not be more expensive than what you tried to do initially - it is just a little more detailed.
source share