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
