Your first law is a very strong requirement; it implies that the functor can have no distinguished "shape" independent of the parametric portion. This rules out any functor that contains extra values (State
, Writer
, &c.) as well as any functor using sum types (Either
, []
, &c.). So this limits us to things like fixed-size containers.
Your second law requires commutativity, which means that order of nesting (that is, functor composition) doesn't matter. This might actually be implied by the first law, since we already know that the functor can't contain any information other than the parametric values, and you explicitly require preservation of that here.
Your third law requires that the functor be idempotent as well, which means that nesting something within itself using fmap is equivalent to itself. This probably implies that if the functor is a monad as well, join
involves some sort of "taking the diagonal". Basically, this means that liftA2 (,)
should behave like zip
, not a cartesian product.
The second and third together imply that however many "primitives" the functor might have, any composition is equivalent to combining at most one of each primitive, in any order. And the first implies that if you throw out the parametric information, any combination of primitives is the same as using none at all.
In summary, I think what you have is the class of functors isomorphic to Reader
. That is, functors where f a
describes values of type a
indexed by some other type, such as a subset of the natural numbers (for fixed-size containers) or an arbitrary type (as with Reader
).
I'm not sure how to convincingly prove most of the above, unfortunately.