[Haskell] Re: Global Variables and IO initializers

Ben Rudiak-Gould Benjamin.Rudiak-Gould at cl.cam.ac.uk
Thu Nov 4 18:18:12 EST 2004


Benjamin Franksen wrote:

 >On Thursday 04 November 2004 17:20, Ben Rudiak-Gould wrote:
 >
 >>This is one of the several ways in which the current implementation of
 >>implicit parameters is broken. Clearly they *should* belong to the
 >>module namespace, and if we modify the implementation so that they do,
 >>the problem you describe here goes away.
 >
 >I have thought about this and I am not sure that this is possible or even
 >makes sense. Remember that implicit parameters cannot be bound at the top
 >level. They must be 'let' or 'where' bound.

Implicit parameter names (not bindings!) are public by their nature. 
This is another way in which they're different from ordinary local 
bindings. When you say "let x = ... in ...", there's no point putting x 
in the module namespace because it's restricted to the current 
expression by lexical scoping anyway. But with implicit parameters you 
run into merging problems if a parameter like ?globals is used in two 
different modules for different purposes, and both modules export a 
function with ?globals in its type.

I don't think the issues here are any different that what we have to 
deal with anyway with user-defined datatypes and type classes showing up 
in exported types. If module Main imports module X, and X exports a 
function with an implicit parameter ?p in its type, then ?p has to be in 
X's namespace, or in the namespace of a module imported by X. Otherwise 
X can't refer to it at all. It can't be in the Main namespace unless X 
imports Main circularly. Export, import, and mention of implicit 
parameters follow the same rules as other module-qualified identifiers.

But I just realized that it will probably be necessary to declare (not 
bind!) implicit parameters at the top level to avoid capture problems. 
(E.g. module X uses a parameter called ?p, but one day module Y, 
imported unqualified by X, decides to add its own parameter ?p, and 
suddenly X's ?p refers to ?Y.p instead of ?X.p.) This is unfortunate, 
because it probably means adding a new keyword to the language.

-- Ben



More information about the Haskell mailing list