Allow top-level shadowing for imported names?

Simon Peyton Jones simonpj at microsoft.com
Mon Oct 3 09:44:08 UTC 2016


Fine with me!

Simon

|  -----Original Message-----
|  From: ghc-devs [mailto:ghc-devs-bounces at haskell.org] On Behalf Of
|  Herbert Valerio Riedel
|  Sent: 03 October 2016 09:29
|  To: ghc-devs <ghc-devs at haskell.org>
|  Subject: Allow top-level shadowing for imported names?
|  
|  Hi *,
|  
|  I seem to recall this was already suggested in the past, but I can't
|  seem to find it in the archives. For simplicity I'll restate the idea:
|  
|  
|      foo :: Int -> Int -> (Int,Int)
|      foo x y = (bar x, bar y)
|        where
|          bar x = x+x
|  
|  results merely in a name-shadowing warning (for -Wall):
|  
|      foo.hs:4:9: warning: [-Wname-shadowing]
|          This binding for ‘x’ shadows the existing binding
|            bound at foo.hs:2:5
|  
|  
|  However,
|  
|      import Data.Monoid
|  
|      (<>) :: String -> String -> String
|      (<>) = (++)
|  
|      main :: IO ()
|      main = putStrLn ("Hi" <> "There")
|  
|  doesn't allow to shadow (<>), but rather complains about ambiguity:
|  
|      bar.hs:7:23: error:
|          Ambiguous occurrence ‘<>’
|          It could refer to either ‘Data.Monoid.<>’,
|                                   imported from ‘Data.Monoid’ at
|  bar.hs:1:1-18
|                                or ‘Main.<>’, defined at bar.hs:4:1
|  
|  
|  This is of course in line with the Haskell Report, which says in
|  https://www.haskell.org/onlinereport/haskell2010/haskellch5.html#x11-
|  1010005.3
|  
|  | The entities exported by a module may be brought into scope in
|  another
|  | module with an import declaration at the beginning of the module.
|  The
|  | import declaration names the module to be imported and optionally
|  | specifies the entities to be imported. A single module may be
|  imported
|  | by more than one import declaration. Imported names serve as top
|  level
|  | declarations: they scope over the entire body of the module but may
|  be
|  | shadowed by *local non-top-level bindings.*
|  
|  
|  However, why don't we allow this to be relaxed via a new language
|  extensions, to allow top-level bindings to shadow imported names (and
|  of course emit a warning)?
|  
|  Unless I'm missing something, this would help to keep existing and
|  working code compiling if new versions of libraries start exporting
|  new symbols (which happen to clash with local top-level defs), rather
|  than resulting in a fatal name-clash; and have no major downsides.
|  
|  If this sounds like a good idea, I'll happily promote this into a
|  proper proposal over at
|  https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithu
|  b.com%2Fghc-proposals%2Fghc-
|  proposals&data=01%7C01%7Csimonpj%40microsoft.com%7C6cb5253b609241e0b10
|  008d3eb675d5e%7C72f988bf86f141af91ab2d7cd011db47%7C1&sdata=COdAXpXOOox
|  mAnZSBnJfbF%2BTctssVUlqn%2BiccABrkF0%3D&reserved=0; I mostly wanted to
|  get early feedback here (and possibly find out if and where this was
|  proposed before), before investing more time turning this into a fully
|  fledged GHC proposal.
|  
|  Cheers,
|    HVR


More information about the ghc-devs mailing list