The real signature of isofromto includes the type variables from the class:
isofromto :: forall a b. IsomorphismFromTo a b => forall p. p a -> p b
Therefore, if we want to be explicit on p, we need to write
to = isofromto @a @b @((->) a) id
to pass those argument as well. Alternatively,
to = isofromto @_ @_ @((->) a) id
makes those arguments to be inferred.
In the longer alternative
to = (isofromto :: (forall p. p a -> p b)) @((->) a) id
the signature is not redundant, since it fixes the a and b type arguments.
Note that, in the general case, having to pass these additional arguments is needed since we might want to call, within to @a @b, an implementation of isofromto from another instance e.g. isofromto @(a,b) @(b,a).
Of course, Haskell could have a notation to indicate "call isofromto from the current instance", without additional type arguments, but has not. I guess in regular programming type inference already covers most cases, and when it's not enough, type applications already provide a means to choose the instance we need (including the current one), so I guess there is no strong need for such a special notation.