Imperative Object Destruction

Simon Marlow simonmar@microsoft.com
Mon, 13 Nov 2000 03:29:41 -0800


> >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

If you want to enforce this kind of encapsulation using the type system, you
could try using the runST trick, something like:

	withOpenFile 
		:: FilePath -> IOMode 
		-> (forall s . OpenFile s -> IO a) -> IO a

of course, this needs the universal quantification extensions implemented in
Hugs & GHC.

Cheers,
	Simon