I actually was more interested in the problems with the "obvious fix" for this, namely the "construct on first use" idiom:

int A(int a) { static int aa = a; return aa; }
int B()      { return A(3); }
int C()      { return A(7); }
int D()      { if (today() == "Tuesday") B(); else C(); return a(0); }

What is the value of D? Notice that this is never a problem with pure functions. The problem is that today() makes this an IO monad, and the swearing starts again.

Dan

Bryan O'Sullivan wrote:
On Fri, Aug 29, 2008 at 4:33 PM, Dan Weston <[EMAIL PROTECTED]> wrote:
C++ faced this very issue by saying that with global data, uniqueness of
initialization is guaranteed but order of evaluation is not.

In C++ circles, this is referred to as the "static initialization
order fiasco", and it is a frequent cause of crashes that are very
difficult to debug.

http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12

I think it would be fair to say that C++ pushed this problem off to
every user of the language. I haven't seen a coherent description of
what the semantics of top-level "<-" should be, but avoidance of
widespread swearing would be at the top of my list of requirements.




_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to