[GHC] #9244: Compiler could warn about type variable shadowing, and hint about ScopedTypeVariables

GHC ghc-devs at haskell.org
Mon Dec 18 09:22:46 UTC 2017


#9244: Compiler could warn about type variable shadowing, and hint about
ScopedTypeVariables
-------------------------------------+-------------------------------------
        Reporter:  stusmith          |                Owner:  kanetw
            Type:  feature request   |               Status:  new
        Priority:  normal            |            Milestone:  8.4.1
       Component:  Compiler          |              Version:  7.6.3
      Resolution:                    |             Keywords:
                                     |  TypeErrorMessages
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Incorrect         |  Unknown/Multiple
  warning at compile-time            |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #1316, #3691,     |  Differential Rev(s):
  #11438, #10581, #11539, #12716     |
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 Before implementing much, it'd be good to write a specification of what
 you are trying to implement.  I think it may be something like this:

 * When compiling without `-XScopedTypevariables`...
 * ...and type variable `a` ''would'' have been in scope if you were
 compiling ''with'' `-XScopedTypeVariables`...
 * ...and when you are about to add implicit quantification over `a`
 * ...then emit a warning

 Example
 {{{
 f :: forall a. [a] -> [a]
 f = ....(let g :: a -> a
              g = ...
          in blah)....
 }}}
 With `-XScopedTypeVariables` the tyvar `a` would have been in scope in the
 body of `f`.  Because it isn't in scope, we are going to implicitly
 quantify over `a` in the type signature for `g`, treating its signature as
 `g :: forall a. a->a`.  That implicit quantification is what we want to
 warn about.

 Question: what if we had instead written
 {{{
 f :: [a] -> [a]
 f = ....(let g :: a -> a
              g = ...
          in blah)....
 }}}
 Now, even with `-XScopedTypeVariables` the tyvar `a` would not be in
 scope. Do we want to warn then too?  I guess so.

 Writing all this down, with a series of examples, would be helpful.

 I can see that it's a bit tricky to implement.  We kind of need an extra
 set of tyvars that would be in scope if `-XScopedTypeVariables` was on,
 but aren't in scope because it isn't.  Is it worth the fuss?  Perhaps.
 Anyway, it'd be worth explaining your proposed implementation path before
 investing effort in implementing it.

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


More information about the ghc-tickets mailing list