
David Place wrote:
On Jun 27, 2011, at 3:50 AM, Heinrich Apfelmus wrote:
Good point, but this actually shows that withFile should be even lazier. In particular:
* The file should not be opened until the string is demanded. * The file should be closed as soon as the string has been demanded in full.
Suppose the file is only partially demanded as in the case I quoted earlier.
print10 = do contents <- withFile "/usr/share/dict/words" ReadMode (\h -> hGetContents h) print $ take 10 contents
The file would never be closed.
Note that my version of withFile has a different type and replaces hGetContents entirely. Regardless, in both cases the intention is that the file contents is evaluated completely *inside* the scope of withFile . In particular, a correct way to write your example would be print10 = withFile' "/usr/share/dict/words" $ print . take 10 (This is completely analogous to how Iteratees require you to process a file. The difference is that Iteratees expresses demand for the characters inside a file via >>= whereas lazy IO expresses demand via `seq` .) Best regards, Heinrich Apfelmus -- http://apfelmus.nfshost.com