[reactive] Bug fixes in progress

Bertram Felgenhauer bertram.felgenhauer at googlemail.com
Sat May 30 11:48:08 EDT 2009


Sterling Clover wrote:
> This is perhaps a silly idea, but perhaps useful -- there should be a 
> version of unsafePerformIO that always does the "right" thing with regards 
> to exceptions. From that, the other unamb primitives can perhaps be built 
> more obviously? Additionally, this implementation would be potentially 
> useful to libraries beyond unamb.

You mean something like this?

-- | A version of 'unsafePerformIO' that assures that the resulting
--   (pure) computation can be restarted if it is killed by an
--   asynchronous exception. Note that as a result, the IO action
--   may be performed more than once.
exceptionSafeUnsafePerformIO act = unsafePerformIO $ retry act
    where
        retry act = unblock act `catch` \SomeException e -> do
             myid <- myThreadId
             throwTo myid e
             retry act

That could be useful indeed.

Btw, in an ideal world we'd distinguish between asynchronous and
synchronous exceptions here, and rethrow them appropriately. Sadly,
there's currently no way to distinguish them. See

    http://hackage.haskell.org/trac/ghc/ticket/2558

regards,

Bertram


More information about the Reactive mailing list