Asynchronous exceptions, such as timeouts, are important for robust, modular programs, but are extremely difficult to program with --- so much so that most programming languages either heavily restrict them or ban them altogether. We extend our earlier work, in which we added synchronous exceptions to Haskell, to support asynchronous exceptions too. Our design introduces scoped combinators for blocking and unblocking asynchronous interrupts, along with a somewhat surprising semantics for operations that can suspend. Uniquely, we also give a formal semantics for our system.
This paper is a heavily-rewritten version of the paper we presented at the Workshop on High Level Concurrent Languages, Montreal, Sept 2000 (no proceedings).