On Tue, Dec 13, 2005 at 09:46:31AM +0100, Emil Axelsson wrote: > Is this just a limitation of the current GATDs, or is it unreasonable of me > to expect this to work?
AFAIK it is a current limitation of GADTs, which will be removed in GHC 6.6. > Is there any workaround, such as coercing the type of the value function? I've had the same problem myself. The workaround is to replace some of type-class constraints with "witness" GADTs. The code I attached shows how you can do it. I chose to make HasX a GADT, and introduce the HasX' type-class, but the latter is only for convenience. Note the subtle change in Val's definition: data Val a where ... X :: HasX a -> Val a -- Unconstrained ^^ Best regards Tomasz -- I am searching for a programmer who is good at least in some of [Haskell, ML, C++, Linux, FreeBSD, math] for work in Warsaw, Poland
{-# OPTIONS -fglasgow-exts #-} data Number = XN -- Unconstrained | N Int -- Constrained data HasX a where HasX_Number :: HasX Number xVal :: HasX a -> a xVal HasX_Number = XN class HasX' a where hasX :: HasX a instance HasX' Number where hasX = HasX_Number x :: HasX' a => Val a x = X hasX data Val a where P :: a -> Val a -- Primitive T2 :: (Val a1, Val a2) -> Val (a1,a2) X :: HasX a -> Val a -- Unconstrained value :: Val a -> a value (X hx) = xVal hx value (P a) = a value (T2 (a1,a2)) = (value a1, value a2) ex1 :: Val (Number,(Number,Number)) ex1 = T2 (P (N 3), T2 (x, P (N 5))) -- ex2 :: Val (Number,Number) -- ex2 = X
_______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell