On Wed, 2009-03-04 at 18:22 -0800, Jonathan Cast wrote:
On Wed, 2009-03-04 at 18:12 -0800, oleg@okmij.org wrote:
We demonstrate how lazy IO breaks referential transparency. A pure function of the type Int->Int->Int gives different integers depending on the order of evaluation of its arguments. Our Haskell98 code uses nothing but the standard input. We conclude that extolling the purity of Haskell and advertising lazy IO is inconsistent.
...
Running the code with Hugs exhibits the same behavior. Thus a pure function (-) of the pure type gives different results depending on the order of evaluating its arguments.
Is 1 = -1?
Lazy IO *as implemented (originally) in GHC* (and copied into the Haskell standard) breaks referential transparency.[1] Clean's object IO system, I believe, would not have this problem. Nor would a well-designed Haskell IO system.
jcc [1] Oops, ignore this reference. I decided against saying what I was going to here.