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 <westondan at imageworks.com> 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.
>>