Bug or feature?

Iavor Diatchki iavor.diatchki at gmail.com
Fri May 17 23:57:37 UTC 2019


I've encountered some odd behavior related to quantification and type families,
but I am not sure if it is a bug or by design.

Here is an example which works fine:

> {-# Language ExistentialQuantification, RankNTypes, TypeFamilies #-}
> data T a b = T a
> t :: T Bool a
> t = T True
> data Q1 = forall a. Q1 (forall b. T a b)
> q1 :: Q1
> q1 = Q1 t

Now, suppose we wanted to constraint the universally quantified type of
the field.  This also works fine:

> data Q2 = forall a. Q2 (forall b. (b ~ Int) => T a b)
> q2 :: Q2
> q2 = Q2 t

However, things break down if the restriction involves a type family:

> type family F a
> data Q3 = forall a. Q3 (forall b. (F b ~ Int) => T a b)
> q3 :: Q3
> q3 = Q3 t

This causes some complaints about *a*, resulting from checking ambiguity.
If we `AllowAmbiguousTypes`, then the definition of `Q3` is accepted, but
`q3` fails with a similar error, complaining that GHC cannot match `a`
with `Bool` because it is "untouchable".

This seems confusing---I would have thought that when we use the `Q3`
constructor we are providing the value for `a` (e.g., it is `Bool`),
so I am not sure why GHC is trying
to match anything.

Any ideas?


More information about the ghc-devs mailing list