[Haskell-cafe] problem with IO, strictness, and "let"

Michael Vanier mvanier at cs.caltech.edu
Fri Jul 13 00:54:08 EDT 2007


That makes sense.  Thanks!

Mike

Stefan O'Rear wrote:
> On Thu, Jul 12, 2007 at 09:22:09PM -0700, Michael Vanier wrote:
>> I stumbled across a problem with IO and strictness that I could fix, but I 
>> can't understand why the fix works.  I've compressed it down into a program 
>> which simply computes the number of lines in a file.  Here is a version 
>> that doesn't work:
>>
>> module Main where
>>
>> import System.IO
>> import System.Environment
>>
>> process_file :: FilePath -> IO ()
>> process_file filename =
>>     do h <- openFile filename ReadMode
>>        c <- hGetContents h
>>        let cs = unlines $ lines c
>>        hClose h
>>        putStrLn $ show $ length cs
> 
> The problem is that you're closing the file twice.  When you call any
> function of the getContents family, you assign to that function the
> responsibility to close the file, no sooner than it is no longer needed.
> Don't call hClose yourself, Bad Things will happen.
> 
> If you get rid of hClose, laziness will not hurt you - infact it will
> help you, by allowing your program to run in constant space.
> 
> Stefan


More information about the Haskell-Cafe mailing list