"interact" behaves oddly if used interactively
olaf at cs.york.ac.uk
Wed Oct 1 18:26:24 EDT 2003
Simon Marlow wrote:
> Certainly you can observe non-strictness, that's not the point. The point is that you can also observe more than just non-strictness using interact, and I don't think that is desirable. For example:
> interact (\xs -> let z = length xs in "Hello World\n")
> Now, Haskell is a pure language, so it shouldn't matter whether the implementation evaluates z or not, as long as it is careful not to violate the non-strict semantics by turning a terminating program into a non-terminating one. A parallel Haskell implementation might happily spawn off another thread to evaluate z for example. An optimistic implementation might evaluate z for a fixed amount of time before continuing with the main thread of evaluation.
> BUT in the presence of lazy I/O this simply isn't true any more. Why? Because z is not pure; evaluating it has a side-effect. And yet it has type Int. Am I the only one who thinks this is wrong?
I don't know what everyone else thinks, but I do not see your problem.
There is nothing impure about z. According to non-strict semantics we
(\xs -> let z = length xs in "Hello World\n") _|_ = "Hello World\n"
So every implementation has to make sure that this equation holds.
You know it is not enough for optimistic evaluation to `avoid _|_' by
evaluating eagerly only for a fixed amount of time. You also have to
bail out if evaluation raises an exception. This in particular if eager
evaluation causes a black hole: reevaluation at some later time may
yield a perfectly fine value. Likewise the presence of lazy IO forces
you to test if the value is currently available or needs to be read from
some handle; the presence of lazy IO adds another sort of black hole.
Yes, the presence of lazy IO makes optimistic evaluation more
complicated, but I do not see that it compromises the purity of the
language in anyway (whatever purity is ;-).
Dept. of Computer Science, The University of York, York YO10 5DD, UK.
Tel: +44 1904 434756; Fax: +44 1904 432767
More information about the Haskell-Cafe