
#7578: Instance selection regression from 7.4 to 7.6 --------------------------------------+------------------------------------- Reporter: nomeata | Owner: Type: bug | Status: closed Priority: normal | Milestone: Component: Compiler (Type checker) | Version: 7.6.1 Resolution: invalid | Keywords: Os: Unknown/Multiple | Architecture: Unknown/Multiple Failure: None/Unknown | Difficulty: Unknown Testcase: | Blockedby: Blocking: | Related: --------------------------------------+------------------------------------- Changes (by simonpj): * status: new => closed * difficulty: => Unknown * resolution: => invalid Comment: Currently this is by-design. What is happening is this. At the local binding of `()`, GHC is trying to infer the most general type of the binding. It sees a constraint `(CollectArgs b)` but at that moment it has a very local view, so it tries to simplify it. Aha. There is an instance declaration `instance Show a => CollectArgs a` which matches. Let's use that! Disaster. You are skating on very thin ice indeed, becuase there are two ways of seeming to satisify `(CollectArgs b)`, one from the context of the first instance decl, and one from the second instance decl itself. The simple way to fix this is to use `-XMonoLocalBinds` which stops GHC trying to generalise the type of the local declatation. This is good in lots of ways: see [http://research.microsoft.com/en- us/um/people/simonpj/papers/constraints/index.htm Let should not be generalised]. I'd be happy for it to be the default, and it's implied by `-XGADTs` and similar, but currently the default is still to generalise local bindings. Simon -- Ticket URL: http://hackage.haskell.org/trac/ghc/ticket/7578#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler