
#12882: Unexpected constraint when using ExistentialQuantification -------------------------------------+------------------------------------- Reporter: danilo2 | Owner: Type: bug | Status: closed Priority: normal | Milestone: Component: Compiler (Type | Version: 8.0.1 checker) | Resolution: invalid | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by mpickering): OK - I got it to compile now, I was missing scoped type variables. Here is the more usual way to write your data type. {{{ {-# LANGUAGE ExistentialQuantification #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE GADTs #-} import Data.Typeable data Elem t where Elem :: Typeable t => Int -> Elem t tst1 :: forall a. Elem a -> TypeRep tst1 (Elem _) = typeRep (Proxy :: Proxy a) }}} Then it is clear why you must pattern match on `Elem` in order to discover that you have the `Typeable` constraint. You could have another constructor which doesn't bind it. For example, {{{ data Elem t where Elem :: Typeable t => Int -> Elem t Elem2 :: t -> Elem t }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/12882#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler