IO monad and lazy evaluation

Derek Elkins ddarius@hotpop.com
Fri, 23 May 2003 08:45:04 -0400


On Fri, 23 May 2003 14:03:47 +0200 (CEST)
Elke Kasimir <elke@espresto.com> wrote:

> 
> On 22-May-2003 Glynn Clements wrote:
> > The problem isn't monads, or lazy functions, or even the
> > interactions between them. The problem is specifically lazy I/O,
> > which is basically a fudge which usually works in simple cases.
> > 
> > The "normal" (i.e. strict) I/O functions are perfectly safe.
> 
> Since Haskell is lazy by default, I consider lazy file reading to be
> the more natural choice, and also a safe one on operating systems like
> unix who lock a copy of the file at the time it's opened, and given
> that such a copy almost always does not come at such a high cost.

This is -a- problem with lazy IO but not -the- problem.  This problem
applies (or not) to strict IO, albeit at least with strict IO you'll
definitely have what you have. The problem is that-within the language-
you can apply strict IO functions (in this case, hClose) to a file that
is being read lazily.  This is also the reason why Ketil Z. Malde said
that readFile -is- safe, as without access to the handle you are
limited to what you can do to a file.

> Unfortunately, the number of file handles is sometimes limited so
> that one is sometimes forced to close lazily read files explizitly
> which is rather tedious...

Combining explicit file closing to a lazily read file is
dangerous, that is the point of this whole thread.  Either use strict
IO throughout or solve this problem with strictness annotations
(deepSeq/rnf may help here). (There is one example where I solved this
problem with a single well-placed $!)  If you do explicitly close a
lazily read file then you better mean what you are saying.