>testMinus1 = join $ runIOM $ withFile "/etc/motd" $ > return . runIOM . qGetChar
Isn't this the same situation we have in Haskell98 with respect to the regular IO? The safety of IO depends on the fact that the IO type constructor cannot be eliminated. Hence the 'main' trick, hence the only function that can eliminate IO is named 'unsafe'. If we wish for the safe runIOM, we have to enforce the same guarantees as we have in the ST monad regarding runST. That of course, cannot be done in Haskell98 (although the resulting library can be used in Haskell98 code). It should be emphasized that the Typeable constraint has reduced the problem of 'region nesting' to the regular problem of the 'linearity' of computations -- which is already solved in ST monad. We can add that pervasive 's' type parameter to our Q and IOM types. However, the simpler approach is just to use our 'mark' as that 's' parameter. So, the only changes are changes in the type signatures: withFile :: Typeable a => FilePath -> (Q mark -> IOM mark a) -> IOM mark a runIOM :: (forall mark. IOM mark a) -> IO a (and adding -fglasgow-exts flag, which is not-viral: the code that uses IO regions can remain Haskell98). Luckily, polymoprhic types, such as |IOM mark a| must be with respect to |mark|, cannot be instances of Typeable, so our safety constraint is automatically satisfied. I knew the polymorphic restriction on Typeable must be good for something. _______________________________________________ Haskell mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell
