[Haskell-cafe] IO and lazyness.

Daniel McAllansmith dm.maillists at gmail.com
Tue Mar 6 16:35:05 EST 2007

On Wednesday 07 March 2007 10:22, D.V. wrote:
> On 3/6/07, mm <schneegloeckchen at gmx.li> wrote:
> > I cannot help you with your question more than pointing you to
> >
> > http://bugs.darcs.net/issue391
> >
> > where Simon Marlow explains how to avoid "IO.bracket".
> I'm using Control.Exception's bracket.
> Also, following Jeremy's advice, I replaced the last line of rechf2
> with   return $! rech r $ lines f       and indeed it works.
> I don't understand why it doesn't without the !
> The documentation for hGetContents says the items are read on demand.
> the function rech needs the strings so they should be read on demand.
> This confuses me :(

The problem is that hGetContents only reads the contents of the file on demand 
and, without the 'return $!' you don't demand the value until somewhere 
outside of rechf.  By this point the hClose has happened and hGetContents has 
no access to the file => no lines => no result.

Using 'return $!' is demanding the value of rech r $ lines f immediately so 
hGetContents accesses the file before the hClose.

hGetContents is implemented using unsafePerformIO so, unless you're very 
careful, you could get other weird behaviours.


More information about the Haskell-Cafe mailing list