
On Tue, Aug 16, 2011 at 04:44:15PM +0200, Ertugrul Soeylemez wrote:
Brent Yorgey
wrote: That's a bit of a contradiction, because you are using existentials yourself in your GADT.
No, he isn't.
data BasicSelect a where SelectionNum :: Num a => a -> BasicSelect a SelectionStr :: Show a => a -> BasicSelect a
'a' shows up in the result type of both constructors, so there is no existential quantification going on here.
Oh, right. How would one express this as an ADT? Seems impossible to me.
You cannot, with just Haskell 2010. Strangely, if you try this: data BasicSelect a = Num a => SelectionNum a | Show a => SelectionStr a you get this error (ghc 7.0.3): Data constructor `SelectionNum' has existential type variables, or a context (Use -XExistentialQuantification or -XGADTs to allow this) In the definition of data constructor `SelectionNum' In the data type declaration for `BasicSelect' And enabling ExistentialQuantification makes the error go away! So apparently the ExistentialQuantification flag also enables type class constraints on data constructors, even when no existential quantification is involved. Odd. -Brent