On 04/07/10 11:12, Simon Marlow wrote:
It's possible to mis-use the API, e.g.

getUnmask = mask return

...incidentally,
unmask a = mask (\restore -> return restore) >>= (\restore -> restore a)

mask :: ((IO a -> IO a) -> IO b) -> IO b

It needs to be :: ((forall a. IO a -> IO a) -> IO b) -> IO b
so that you can use 'restore' on two different pieces of IO if you need to. (alas, this requires not just Rank2Types but RankNTypes. Also, it doesn't cure the loophole. But I think it's still essential.)

nonInterruptibleMask :: ((IO a -> IO a) -> IO b) -> IO b
nonInterruptibleMask_ :: IO a -> IO a

which is just like mask/mask_, except that blocking operations (e.g.
takeMVar) are not interruptible.

What would be an appropriate use of this?

-Isaac
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to