<p dir="ltr">I think I didn't explain myself well enough. I'm not talking about expanded defaulting, although that may be tied up with the same mechanisms. Perhaps the best thing is just to work on the error message text for certain ambiguous type situations. Notably, situations where adding a proxy argument or similar is needed to avoid the error tend to be pretty mysterious until you realize that the system is not complaining because it can't determine a type, but rather because there is no way to pinpoint that type at the use site.</p>
<p dir="ltr">If F is a type family then</p>
<p dir="ltr">f :: Foo x => F x</p>
<p dir="ltr">has a perfectly sensible translation, namely</p>
<p dir="ltr">f :: forall x . Foo x -> F x</p>
<p dir="ltr">The problem is purely one of inference on the Haskell side: there is no way to add a signature *at the call site* that determines what value of x to pass to f. The error message about x being ambiguous because F is a type family has to be read a bit backwards. At a *use site*, it'll be pretty clear-cut what's ambiguous, and it will soon become clear why it can't be pinned down. Perhaps it would pay to change the error message to explain why the type signature renders the term unusable.</p>