[Haskell-cafe] One-shot? (was: Global variables and stuff)

Adrian Hey ahey at iee.org
Sat Nov 13 05:00:45 EST 2004

On Saturday 13 Nov 2004 9:15 am, Keean Schupke wrote:
> >I'm not sure I understand what problem you think there is. Are the inits
> >you're talking about module inits? If so, I don't think there's a problem,
> >for several reasons.
> >
> >The idea under discussion is that a top level (x <- newThing) should
> >be lazy, (no action at all occurs until value of x is demanded). IOW,
> >it's exactly the same as the current unsafePerformIO hack, but not unsafe
> >because the compiler knows the semantics. So there is no implied "module
> >initialisation"
> Okay - I can see that with lazy semantics this might not be a problem...
> What happens with
> the second problem: That where module B uses A internally and C uses A
> internally, then
> I write a new module that tries to use B & C together... This
> potentially breaks B & C. I think
> you need the extra restriction that the top level '<-' bindings must not
> be exported. So where
> does that leave us.
> Top level inits are safe (I think) iff:
>     - They are lazy (the definition only happens when required)
>     - They contain only a subset of IO actions - namely those concerned
>           with name creation within Haskell that don't actually do any IO.
>     - They are not exportable from the module that contains them.
> I think that covers it... have I forgotten anything?

One of us has :-) Not sure who though.

I thought I'd covered the second problem you're alluding to already.
But if you think there's still a problem you'd better elaborate a little
more. Certainly I see no reason why top level TWI's cannot be exported
from a module. We don't have this constraint with the unsafePerformIO

For instance, if I had

 userInit <- oneShot realInit

is there any reason why userInit can't be safely exported and used
in many different modules? The whole idea was that it should be.

Adrian Hey

More information about the Haskell-Cafe mailing list