hGetContents leads to late/silent failures
A common newbie error:
withFile "file" ReadMode hGetContents >>= putStr
The problem, of course, is that the result of withFile "file" ReadMode hGetContents
isn't forced until putStr
is executed, at which point the file has already been closed. The Haskell report doesn't specify what it will find, and, at least in 7.6.3, it finds the string empty. The behavior that seems most correct to me would be to guarantee that if a file has not been completely read (or read up to an I/O error) when it is closed, then its contents should be reported as something like "Four score and seven years ag"++error "Forcing a suspended computation led to an attempted read from a handle that was already closed."
My suggested fix is in a comment below.