haskell - Pattern Matching on GADTs -
i've created gadt expressions. when pattern match on constructors have constraints, typechecker unable deduce constraints on type variables used in constructor's constraints. think code , error message more elucidating.
{-# language gadts, multiparamtypeclasses #-} import data.word data expr value :: -> expr cast :: (castable b) => expr -> expr b class castable b cast :: -> b instance castable word64 word32 cast = fromintegral instance (show a) => show (expr a) show (cast e) = "cast " ++ show e -- error the error get:
gadt.hs:16:30: not deduce (show a1) arising use of `show' context (show a) bound instance declaration @ gadt.hs:15:10-34 or (castable a1 a) bound pattern constructor cast :: forall b a. castable b => expr -> expr b, in equation `show' @ gadt.hs:16:9-14 possible fix: add (show a1) context of data constructor `cast' or instance declaration in second argument of `(++)', namely `show e' in expression: "cast " ++ show e in equation `show': show (cast e) = "cast " ++ show e edit: if comment out show (expr a) instance , add following code, works fine:
eval :: expr -> eval (value a) = eval (cast e) = cast $ eval e main = let bigvalue = maxbound `div` 2 + 5 :: word64 e = cast (value bigvalue) :: expr word32 v = eval e putstrln "typechecks." print (bigvalue, v) i want show instance print cast (value bigvalue).
cast :: (castable b) => expr -> expr b so here:
instance (show a) => show (expr a) show (cast e) = "cast " ++ show e -- error cast e of type expr a. have show a constraint, , instance implies show (expr a), can call show on things of type expr a.
but e not of type expr a. cast takes argument of any type expr a1 , gives expr a (renaming type variables stay consistent we're talking in instance), e of type expr a1. don't have show constraint type a1, , require show a1 imply show (expr a1), there's no way show e.
and there's no way add such constraint in show instance, because type a1 doesn't appear in type of cast e. seems whole point of using gadt here; you've deliberately thrown away information type of thing cast applied (other fact castable a1 a holds), , declared result expr a.
Comments
Post a Comment