At 2000-11-13 02:18, Hannah Schroeter wrote:
That's the problem. And I think your solution is overly complicated.
Why not copy what Common Lisp does, just that Haskell can do it without macros:
withOpenFile :: FilePath -> IOMode -> (Handle -> IO a) -> IO a withOpenFile name mode action = do handle <- openFile name mode result <- (action handle) `finally` (hClose handle) return result
Usage:
count :: Handle -> IO Int read :: Handle -> IO [Byte]
fileLength <- withOpenFile "filename" ReadMode $ \handle -> count handle fileContent <- withOpenFile "filename" ReadMode $ \handle -> read handle
Doesn't fulfill condition 2: 2. no read or write operations are performed on file-handles that have not yet been opened, or that have already been closed. ...since you can do stealHandle = withOpenFile "filename" ReadMode (\handle -> handle) stealHandle >>= read -- Ashley Yakeley, Seattle WA