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

GHC ghc-devs at haskell.org
Fri Jun 27 15:34:39 UTC 2014


#9244: Compiler could warn about type variable shadowing, and hint about
ScopedTypeVariables
-------------------------+-------------------------------------------------
       Reporter:         |             Owner:
  stusmith               |            Status:  new
           Type:         |         Milestone:
  feature request        |           Version:  7.6.3
       Priority:         |  Operating System:  Unknown/Multiple
  normal                 |   Type of failure:  Incorrect warning at
      Component:         |  compile-time
  Compiler               |         Test Case:
       Keywords:         |          Blocking:
   Architecture:         |
  Unknown/Multiple       |
     Difficulty:         |
  Unknown                |
     Blocked By:         |
Related Tickets:         |
-------------------------+-------------------------------------------------
 GHC already warns about variable shadowing:


 {{{
 timesTwoPlusOne x
     = timesTwo x + 1
   where timesTwo x = x * 2

 Warning:
     This binding for `x' shadows the existing binding
       bound at <location>
 }}}



 However the similar warning doesn't happen for type variables.


 {{{
 tryMaybe :: IO a -> IO (Maybe a)
 tryMaybe action = do
     result <- (try action) :: IO (Either SomeException a)
     return $ case result of
         Left _  -> Nothing
         Right v -> Just v

     Couldn't match type `a' with `a1'
       `a' is a rigid type variable bound by
           the type signature for tryMaybe :: IO a -> IO (Maybe a)
           at types.hs:<line>:13
       `a1' is a rigid type variable bound by
            an expression type signature: IO (Either SomeException a1)
            at types.hs:<line>:15
     Expected type: IO a1
       Actual type: IO a
 ...
 }}}


 Here, I thought that the 'a' in the function's type declaration was the
 same 'a' in the expression type declaration. However in Haskell 98, they
 are completely different variables.

 Suggestion: if a type variable is renamed by the compiler due to a clash
 with another type variable, issue a warning that the second shadows the
 first, and give a hint about using -XScopedTypeVariables and forall.

 Alternative suggestion: if an error is displayed, where the error contains
 a renamed type variable, issue a hint that the second shadows the first,
 and give a hint about using -XScopedTypeVariables and forall.

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


More information about the ghc-tickets mailing list