Injective type families

Isaac Dupree ml at
Fri Jul 11 03:54:36 UTC 2014

On 07/10/2014 02:34 PM, Gabor Greif wrote:
> Jan, this is great! Thanks for attacking this issue.
> Regarding "result", I do not like the idea to introduce arbitrary
> words with special meanings. What if somebody writes
>>    injective type family F a result c | result -> a result c
> it will be totally confusing.
> One could write like this:
>>    injective type family F a b c | F a b c -> a b c  -- (*)
> or even shorter:
>>    injective type family F a b c | F -> a b c  -- (**)
> in (*) the syntax is inconsistent because to the left of the "|"
> juxtaposition is not meaning application. Also (*) would permit "... |
> F x b c -> a b c" which is confusing and would require a naming rule.
> (**) can be read as "F's result uniquely determines all of a b and c".
> It sounds ok if you repeat it often enough :-)

At the risk of being too clever, one could use the keyword "type" to
reference the result.  If F is a family of types (a "type family"), then
the result is conceptually a single type in this family.

> type family F a b c | type -> a b c


More information about the ghc-devs mailing list