Ashley Yakeley:
On Mon, 2009-09-14 at 00:40 +1000, Manuel M T Chakravarty wrote:
I don't see what the problem is. "instance C (Fam Int)" has an
unambiguous, and logically acceptable, meaning to the compiler. Why
do we force the programmer to make an ugly workaround involving
introducing a type variable?

I think the proposed change is confusing.  Two instances

  instance C (Fam Int)
  instance C (Fam Bool)

appear to be syntactically distinct, but they semantically overlap.
The explicit form

  instance (Fam Int ~ famint) => C famint

is IMHO much clearer and really not much more verbose.

It's really no different from this

 type Syn a = ()

 instance C (Syn Int)
 instance C (Syn Bool)

It's quite different. A type synonym can always be unfolded. That is not the case for a type family; e.g.,

  type family F a
  type instance F [Int] = ...

  instance C (F [a])

Whereas `instance C (Syn Int)' is synonymous to `instance C ()', there is no such "normal form" for `instance C (F [a])'.

This is a fundamental difference between type synonyms and type families and the reason for most of the restrictions that we impose on type families over type synonyms (e.g., synonyms may be partially applied in some situations, whereas families may never be applied partially).

Manuel

_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to