
#15294: Unused "foralls" prevent types from being Coercible -------------------------------------+------------------------------------- Reporter: Iceland_jack | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: 8.6.1 Component: Compiler | Version: 8.4.3 Resolution: | Keywords: Roles 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 goldfire): I think this is expected behavior. Representational equality still falls short of its goal of equating all things with equal representation. For example, `Bool` is not `Coercible` to `data BBool = FFalse | TTrue`, even though `Bool` and `BBool` (plausibly) have the same representation. It's true that `forall a. Int -> Bool` and `Int -> Bool` have the same runtime representation, but they crucially look quite different in Core. A member of `forall a. Int -> Bool` looks like `/\ (a :: Type). \ (x :: Int). ...`, while a member of `Int -> Bool` looks like `\ (x :: Int). ...`. One could imagine extending representational equality in this way (it would be sound, if we get the details right), but I don't think it's worth it. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15294#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler