Hi Oleg

This approach has the same flaw as your "Simple IO Regions" code. The typing prevents you from constructing actions involving a handle outside the region of the handle, but not from constructing actions in the region and using them outside. Without the rank-2 types we can use runIOM, and should to take advantage of the Typeable1 IO instance.

--saving this message as IORegionsTest98Fail.lhs

>module IORegions98TestFail where
>import IORegions98
>import Monad

>testMinus1 = join $ runIOM $ withFile "/etc/motd" $
>                               return . runIOM . qGetChar

Which fails like this:
   ___         ___ _
  / _ \ /\  /\/ __(_)
 / /_\// /_/ / /  | |      GHC Interactive, version 6.4, for Haskell 98.
/ /_\\/ __  / /___| |      http://www.haskell.org/ghc/
\____/\/ /_/\____/|_|      Type :? for help.

Loading package base-1.0 ... linking ... done.
Compiling IORegions98      ( ./IORegions98.hs, interpreted )
Compiling IORegions98TestFail ( IORegions98TestFail.lhs, interpreted )
Ok, modules loaded: IORegions98TestFail, IORegions98.
*IORegions98TestFail> testMinus1
Loading package haskell98-1.0 ... linking ... done.
*** Exception: /etc/motd: hGetChar: illegal operation (handle is closed)

I think something like the Simple IO Regions code can be made to work with a more complicated representation of the marks set. I'll see if I can post a system of my own in a few days, rather than just test cases for yours.

Brandon
_______________________________________________
Haskell mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to