|
Re: Imperative Object Destruction: msg#00040lang.haskell.general
Hello! On Mon, Nov 13, 2000 at 09:27:07AM -0000, Chris Angus wrote: > why not create an abstract datatype > OpenFile a which is a monad > data OpenFile a = OpenFile (Maybe FileHandle -> IO a) > and create you operations in terms of this > openFile :: String -> OpenFile () > count :: OpenFile Int > read :: Int -> OpenFile [Byte] > then you could habe a run function > runOF :: OpenFile a -> IO a > which ran whatever you wanted for the file and ensured tahthe file was > closed correctly afterwards. > How we would do this with 2 files however I'm not so sure. > [...] 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 or even, if you want both results without opening the file twice: rewind :: Handle -> IO () (fileLength, fileContent) <- withOpenFile "filename" ReadMode $ \handle -> do len <- count handle rewind handle cont <- read handle return (len, cont) Two files: result <- withOpenFile "file1" ReadMode $ \handle1 -> withOpenFile "file2" ReadMode $ \handle2 -> ... Kind regards, Hannah. |
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| Previous by Date: | RE: Imperative Object Destruction: 00040, Chris Angus |
|---|---|
| Next by Date: | Re: Imperative Object Destruction: 00040, Ashley Yakeley |
| Previous by Thread: | RE: Imperative Object Destructioni: 00040, Chris Angus |
| Next by Thread: | Re: Imperative Object Destruction: 00040, Ashley Yakeley |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |