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
[email protected]
http://www.haskell.org/mailman/listinfo/haskell