
André Vargas Abs da Cruz wrote:
I think this is a totally newbie question as i am a complete novice to Haskell. I am trying to write down a few programs using GHC in order to get used with the language. I am having some problems with a piece of code (that is supposed to return a list of lines from a text file) which I transcribe below:
module Test where
import IO
readDataFromFile filename = do bracket (openFile filename ReadMode) hClose (\h -> do contents <- hGetContents h return (lines contents))
The question is: if i try to run this, it returns me nothing (just an empty list). Why does this happen ? When i remove the "return" and put a "print" instead, it prints everything as i expected.
hGetContents reads the file lazily; it won't actually read anything
until you try to "consume" the result. However, by that point, you
will have called hClose.
In general, you shouldn't use hClose in conjunction with lazy I/O
(hGetContents etc) unless you are certain that the data will have been
read.
When you put the "print" in place of the return, you force the data to
be consumed immediately, so the issue doesn't arise.
--
Glynn Clements