The foundational concept is functoriality, i.e. mapping over the argument of a type. Whether a datatype has an instance of
1. (covariant) Functor
2. Contravariant functor
3. Functor+Contravariant (phantom argument), or
4. neither
says a lot about its structure and tells me what further questions I can ask (what hierarchies I can expect): A datatype can only be a Monad if is covariant. It can only be Divisible and Decidable if it is contravariant. If it is both (3.) then its argument is not used (phantom) and can be mapped to any type. If it is neither (4.) it can be invariant (where the argument appears in both positive and negative position: like the Endo datatype) or a more complicated datatype like GADT, which would require a more complicated functor.