[Haskell-cafe] type refinement to a typeclass constrained type
Daniil Elovkov
daniil.elovkov at googlemail.com
Thu Mar 22 16:42:32 EDT 2007
Ok, thank you very much.
Interesting thing though, it's the same on 6.4.1.
Wasn't this brokenness introduced in 6.6, but rather has lingered in
ghc for a while, or since the introduction of GADTs, at all?
2007/3/22, Simon Peyton-Jones <simonpj at microsoft.com>:
> Try the HEAD. GADTs + type classes are broken in 6.6., and will stay that way I'm afraid.
>
> Simon
>
> | -----Original Message-----
> | Wrom: HYUCDDJBLVLMHAALPTCXLYRWTQTIPWIGYOKSTTZRCLBDXRQBGJSNBOHMKHJYFMYXOEAIJJPHSCRTNHGSWZIDREXCAXZOWC
> | 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