[GHC] #11339: Possible type-checker regression in GHC 8.0

GHC ghc-devs at haskell.org
Mon Jan 4 04:06:08 UTC 2016


#11339: Possible type-checker regression in GHC 8.0
-------------------------------------+-------------------------------------
        Reporter:  hvr               |                Owner:  goldfire
            Type:  bug               |               Status:  new
        Priority:  highest           |            Milestone:  8.0.1
       Component:  Compiler (Type    |              Version:  8.1
  checker)                           |
      Resolution:                    |             Keywords:
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):

 This is truly bizarre.

 Here are a few things I've learned:
 1. The module compiles with `-XNoMonomorphismRestriction`. This is
 actually correct behavior. The issue is that the inferred type of `t` is
 quantified (by `Applicative f`). The monomorphism restriction forbids
 this. So the new behavior is correct, I think.

 2. Sadly, adding `t :: Applicative f => (a -> f b) -> f t`, by itself,
 doesn't fix the problem

 3. The line that you say doesn't compile does indeed compile if you add `t
 :: Applicative f => (a -> f b) -> f t`

 4. The line that you say doesn't compile does indeed compile if you add
 `-XMonoLocalBinds`.

 5. Saying `t :: _` emits no warning. I have no idea why.

 Here is some interpretation of the above:

 A. Fact (2) is a consequence of the fact that GHC considers itself to be
 inferring a type for all pattern bindings, even if there is a complete
 type signature. (See `TcBinds.decideGeneralisationPlan`) I don't know why
 this is the case; I did not change this behavior. Visible type application
 does a little extra jiggery pokery when inferring types. See `Note
 [Instantiate when inferring a type]` in !TcBinds. This jiggery pokery is
 triggered because we're inferring the type of `t`, even when a type
 signature is given.

 B. Facts (3) and (4) (really the fact that the commented line doesn't
 compile in the first place) is because we're in the quite rare scenario
 where `-XMonLocalBinds` is a good idea, even absent type families / GADTs.
 This is not the first such example, but I don't have a link to a previous
 one. Perhaps `RankNTypes` should imply `MonoLocalBinds`.

 Bottom line: The only real bug in here is (2). It really should compile
 with the type signature, regardless of the monomorphism restriction. But
 it doesn't. However, the example as submitted should be rejected, I
 believe.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11339#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list