[Haskell-cafe] type refinement to a typeclass constrained type
Simon Peyton-Jones
simonpj at microsoft.com
Thu Mar 22 13:37:30 EDT 2007
Try the HEAD. GADTs + type classes are broken in 6.6., and will stay that way I'm afraid.
Simon
| -----Original Message-----
| From: haskell-cafe-bounces at haskell.org [mailto:haskell-cafe-bounces at haskell.org] On Behalf Of Daniil
| Elovkov
| Sent: 22 March 2007 17:12
| To: haskell-cafe at haskell.org
| Subject: [Haskell-cafe] type refinement to a typeclass constrained type
|
| Hello folks
|
| A section on GADTs in the GHC user's guide gives a simple example:
|
| data Term a where
| Lit :: Int -> Term Int
| Succ :: Term Int -> Term Int
| IsZero :: Term Int -> Term Bool
|
| eval :: Term a -> a
| eval (Lit i) = i
| eval (Succ t) = 1 + eval t
| eval (IsZero t) = eval t == 0
|
| let's add
| Sum :: Term Int -> Term Int -> Term Int
| eval (Sum l r) = eval l + eval r
|
| it's ok
|
| But when I do this
| Sum :: (Num a) => Term a -> Term a -> Term a
| eval (Sum l r) = eval l + eval r --- same
|
| it doesn't typecheck with the error "no isntance Num a"
|
| writing
| eval (Sum (l::Num b => Term b) (r::Num b => Term b))
| doesn't help.
|
| I wonder, if there's a way to do what I'm trying to do. After all, I'm
| allowed to declare Term that way. Or is this a restriction of type
| refinement?
| _______________________________________________
| Haskell-Cafe mailing list
| Haskell-Cafe at haskell.org
| http://www.haskell.org/mailman/listinfo/haskell-cafe
More information about the Haskell-Cafe
mailing list