
#8994: type checker could not deduce ambiguous instances -------------------------------------+------------------------------------ Reporter: divip | Owner: Type: bug | Status: closed Priority: normal | Milestone: Component: Compiler | Version: 7.8.2 Resolution: invalid | Keywords: Operating System: Unknown/Multiple | Architecture: Unknown/Multiple Type of failure: None/Unknown | Difficulty: Unknown Test Case: | Blocked By: Blocking: | Related Tickets: -------------------------------------+------------------------------------ Changes (by simonpj): * status: new => closed * resolution: => invalid Comment: The reason this works in 7.6.3 is because GHC defaults the ambiguous type variable 'b', which arises from the call to `f` in `run (f 0)`. It sets `b := Integer`, and all is well. But 7.8 is more cautious about defaulting. Consider: {{{ class (c ~ Int) => C a c where type F a f :: b -> a run :: (forall a c. C a c => a) -> () }}} In this form there is another way to make the program typecheck, by setting `b := c`. So GHC's defaulting rule (which is necessarily ad-hoc, and always was), is a bit more conservative in 7.8, and declines to set `b := Integer` in case you really intended `b := c`. So you need a type signature. This would not be a hard design choice to liberalise. But I erred on the side of being conservative. Generally speaking it's better not to rely on defaulting, anyway. Just use that type signature! I'll close as invalid, but I'm open to user pressure! Simon -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8994#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler