John Meacham wrote:
>With my mdo proposal, and I think all proposals brought forth, the
>module system behaves identically to how it normally does for
>namespace control. [...] modules do not change code at all, they
>are pure syntantic sugar for deciding what names you can see.
I'm not sure I understand your mdo proposal correctly then. A lot of
this debate has been over what should happen when a module has a
top-level action like
x <- putStrLn "hello"
Everyone agrees that "hello" should be printed at most once, and that if
the value of x is ever demanded, it should be printed exactly once. But
there's disagreement on everything else. What if I import the module
containing the above declaration, but it can be proven statically that
the value of x will never be demanded? What if it can't be proven
statically, but it happens to be true on a particular run? If "hello" is
printed even when x's value is not demanded, then import does more than
bring names into scope: it also sometimes adds things to the top-level
mdo. If "hello" is printed only when x's value is demanded, then import
is okay but the <- construct is unsafe (though safer than unsafePerformIO).
This kind of thing turned a lot of people off to the idea of top-level
initialization actions. George Russell's proposal is appealing because
it neatly avoids such problems.
-- Ben