
#9858: Typeable instances should be kind-aware -------------------------------------+------------------------------------- Reporter: dreixel | Owner: Type: bug | Status: merge Priority: highest | Milestone: 7.10.2 Component: Compiler | Version: 7.9 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: None/Unknown | Unknown/Multiple Blocked By: | Test Case: Related Tickets: | typecheck/should_fail/T9858a, | should_run/T9858b | Blocking: | Differential Revisions: Phab:D652 -------------------------------------+------------------------------------- Comment (by oerjan): Shachaf and I experimented a bit, and the fix does *not* prohibit `Typeable` for unapplied type constructors. Together with the polykinded instance for type application, this can be used to construct, albeit awkwardly, `Typeable` instances for actual constraints. Example: {{{ shachaf> λ> let foo :: forall a b. (Typeable a, Typeable b) => Proxy a -> Proxy b -> Proxy (a b) -> TypeRep; foo _ _ _ = typeRep (Proxy :: Proxy (a b)) in foo (Proxy :: Proxy Ord) (Proxy :: Proxy Int) (Proxy :: Proxy (Ord Int)) shachaf> Ord Int }}} It is also possible to tease out constraint tuple constructors with type equalities (OK I'm not sure this was actually tested with HEAD, but I suspect it will work there): {{{ shachaf> > let x :: forall (a :: Constraint -> Constraint -> Constraint) b c. (a b c ~ (Ord Int, Show Int)) => TypeRep; x = typeRep (Proxy :: Proxy a) in x lambdabot> (,) }}} So my theory is that the only thing this fix *strictly* prohibits is `Typeable` for types involving nullary constraint constructors, including `()`. Luckily we don't see a way to get an exploit without `()`, for now. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/9858#comment:90 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler