Skip to content

Equality constraint not available in pattern type signature (GADTs/ScopedTypeVariables)

data Exp a where
  Tru :: Ty Bool

eval :: Exp a -> a
eval Tru = True 

Works fine, as does

eval :: Exp a -> a
eval (Tru :: Exp _) = True 

But

eval :: Exp a -> a
eval (Tru :: Exp Bool) = True

doesn't, is this an intended design of GADTs/ScopedTypeVariables that the type equality constraint isn't in scope in the type signature of the pattern match, I would like to match on an existential type in my own code:

compile (ArrIx arr index :: Exp (Sca elt)) = do
  ...

It can be worked around by writing:

eval a@Tru =
  case a :: Exp Bool of

but for my own code it seems I must write

compile uuu@(ArrIx arr index :: Exp a) = do
  case uuu :: (a ~ Sca elt) => Exp (Sca elt) of
Trac metadata
Trac field Value
Version 7.10.3
Type Bug
TypeOfFailure OtherFailure
Priority lowest
Resolution Unresolved
Component Compiler (Type checker)
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information