We actually used to support contexts in type synonyms but this was
removed from the language after some debate. The basic issue is that
this is equlvilant to allowing more general types in contexts, as in
Eq([a]) => a
Ord((Int,b)) => (Int,b)
Contexts in data declarations do not present similar problems - the
context is simply pushed into the data constructors. We can't do that
with the context in a synonym; this leads to the necessity of context
reduction in places like derived instance processing.
Whether we backed off because there was some fundamental issue we
didn't fully understand or just to keep the language a bit simpler I
don't remember, but I suspect the latter.
John Peterson
Yale Haskell Project