
#10079: Coercible solver regression: Couldn't match rep of () with Const () b -------------------------------------+------------------------------------- Reporter: glguy | Owner: goldfire Type: bug | Status: new Priority: high | Milestone: 7.10.1 Component: Compiler (Type | Version: 7.10.1-rc1 checker) | Keywords: Resolution: | Architecture: Operating System: Unknown/Multiple | Unknown/Multiple Type of failure: GHC rejects | Test Case: indexed- valid program | types/should_compile/T10079 Blocked By: | Blocking: Related Tickets: #7788, #8550 | Differential Revisions: Phab:D653 -------------------------------------+------------------------------------- Comment (by simonpj):
Before Phab:D653, this case was handled by the `rec_nts` trick -- a newtype could be unwrapped only once. The problem with this trick is that it makes type inference a little wonky: canonicalization wasn't idempotent! For example, canonicalizing `Coercible skolem A` would get you `Coercible skolem [A]`.
I don't agree. Looking at HEAD, I see {{{ can_eq_nc' rdr_env envs ev ReprEq ty1 _ ty2 ps_ty2 | Just (co, ty1') <- tcTopNormaliseNewTypeTF_maybe envs rdr_env ty1 = can_eq_newtype_nc rdr_env ev NotSwapped co ty1 ty1' ty2 ps_ty2 }}} This case simply won't fire on `Coercible skolem [A]`. The HEAD does not aggressively unwrap newtypes deep inside types, only immediately under a `Coercible`. And that's what we should do in the new version too. Simon -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10079#comment:24 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler