
#12587: InstanceSigs doesn't work with ambigous types -------------------------------------+------------------------------------- Reporter: vagarenko | Owner: Type: bug | Status: closed Priority: normal | Milestone: Component: Compiler | Version: 8.0.1 Resolution: invalid | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: GHC rejects | Unknown/Multiple valid program | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by simonpj): * status: new => closed * resolution: => invalid Comment: In your instance decl (I have renamed the forall'd variable). {{{ instance Bar Int where bar :: forall c. (Foo c) => Int -- error here bar = undefined where x :: c x = undefined }}} GHC is trying to check that the instance signature you ''provide'': {{{ bar :: forall c. Foo c => Int }}} is more general than the one that is ''required'': {{{ bar :: forall b. Foo b => Int }}} To to that it * instantiates the required one, giving `[W] Foo b0` * unifies provided and requied types `Int ~ Int` * checks that it can prove the required `[W] Foo b0` from the given `Foo c`. But it can't prove that because nothing tells GHC to instantiate `b0` to `c`. I think this is fair enough: it really is an ambiguous type. The same thing would happen if you used an auxiliary function {{{ instance Bar Int where bar = barInt barInt :: forall c. (Foo c) => Int -- error here barInt = undefined where x :: c x = undefined }}} Indeed, it'd be surprising if this didn't work but the previous code did. So I think it's fine. Yell if you disagree. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/12587#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler