On Wednesday 07 March 2007 10:22, D.V. wrote:
> On 3/6/07, mm <[EMAIL PROTECTED]> 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.


Daniel
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to