GADT records revisited

"Philip K.F. Hölzenspies" p.k.f.holzenspies at
Fri Jan 17 06:51:26 UTC 2014

Dear all,

I was playing around with GADT-records again and ran into behaviour that 
I'm not sure is intentional. Given this program:


data FooBar x a where
   Foo :: { fooBar :: a } -> FooBar Char a
   Bar :: { fooBar :: a } -> FooBar Bool a

GHC tells me this:

     Constructors Foo and Bar have a common field `fooBar',
       but have different result types
     In the data declaration for `FooBar'
Failed, modules loaded: none.

The user guide does say (section 7.4.7): "However, for GADTs there is 
the following additional constraint: every constructor that has a field 
f must have the same result type (modulo alpha conversion)." So this 
behaviour is documented in the user guide. However, it seems reasonable 
that in the case above, where all the relevant variables are exposed in 
the result type of both constructors, this should be perfectly typeable. 
In other words, shouldn't GHC be able to derive a type that is simply:

fooBar :: FooBar x a -> a


Is this something that was simply never implemented, but could be, or is 
this not decidable or prohibitively computationally complex?


More information about the Glasgow-haskell-users mailing list