Proposal: Scoping rule change

Heinrich Apfelmus apfelmus at quantentunnel.de
Wed Jul 25 11:29:15 CEST 2012


Heinrich Apfelmus wrote:
> Lennart Augustsson wrote:
>> It's not often that one gets the chance to change something as
>> fundamental as the scoping rules of a language.  Nevertheless, I would
>> like to propose a change to Haskell's scoping rules.
>>
>> The change is quite simple.  As it is, top level entities in a module
>> are in the same scope as all imported entities.  I suggest that this
>> is changed to that the entities from the module are in an inner scope
>> and do not clash with imported identifiers.
>>
>> Why?  Consider the following snippet
>>
>>     module M where
>>     import I
>>     foo = True
> 
> I like it.
> 
> That said, how does the the fact that the scope is nested affect the 
> export list? If the module scope is inside the scope of the imports, 
> then this means the name  I.foo  should appear in the export list, not 
> foo , because the latter is in the outermost scope.
> 
> I think the solution to these problems is to rearrange the  import 
> declarations so that the syntax mirrors the scoping rules. In other 
> words, I boldly propose to move the  import  declaration *before* the 
> module  declaration, i.e.
> 
>    import I
>    module M where
>    foo = True
> 
> or even
> 
>    import I where
>    module M where
>    foo = True
> 
> This way, it is clear that the module M opens an inner scope and that 
> the export list of M uses the names from the inner scope.

Actually, the latter syntax should be

    import I in ...
    let import I in ...

The idea is that this mirrors a  let  expression. (The "where" keyword 
would be misleading.)


Best regards,
Heinrich Apfelmus

--
http://apfelmus.nfshost.com




More information about the Haskell-prime mailing list