For Applicative
, that can be justified through parametricity. Consider...
(&*&) :: Applicative f => f a -> f b -> f (a, b)
... which is the counterpart to (<*>)
in the monoidal presentation of Applicative
. Restricted to functions, the free theorem for (&*&)
is:
fmap g u &*& fmap h v = fmap (bimap g h) (u &*& v)
(The free theorem is actually more general than that, as it allows for relations that aren't functions to play the roles of g
and h
.)
The free theorem means that if we change the values-in-the-functor of u
or v
, the result of (&*&)
will only be affected by its corresponding values-in-the-functor being changed in the same manner. In other words, as far as (&*&)
is concerned the values-in-the-functor have no influence over the applicative effects, which is what you intended to establish.