?Z=     \Just like ExceptT from transformers but with a different Applicative instance.(c) Alexander Vieth, 2015BSD3aovieth@gmail.com experimentalnon-portable (GHC only) Safe-Inferred+ BDescription of concurrent computation with sequential components. (c) Alexander Vieth, 2015BSD3aovieth@gmail.com experimentalnon-portable (GHC only)None !"+-BHMA witness of this type proves that g is in some sense compatible with IO: we can bind through it. TBD would it suffice to give the simpler type forall a . g (IO a) -> IO (g a) ?This corresponds to the notion of a monad transformer; there is some monad g, and then its associated transformer f. If you have anf m athen you can get anm (g a)just by the definition of what it means to be a monad transformer. Here we're interested in the special case where we can achieve IO (g a). This does not mean we have to be dealing with an f IO a, it could mean that the IO is buried deeper in the transformer stack!aDescription of computation which is composed of sequential and concurrent parts in some monad.EDescription of the way in which a monadic term should be carried out.cRun a Concurrential term with a continuation. We choose CPS here because it allows us to explot  withAsync\, giving us a guarantee that an exception in a spawning thread will kill spawned threads. YRun a Concurrential term, realizing the effects of the IO-like terms which compose it. 5Create an IO which must be run sequentially. If a sequentially io appears in a Concurrential t term then it will always be run to completion before any later sequential part of the term is run. Consider the following terms:  a = someConcurrential *> sequentially io *> someOtherConcurrential b = someConcurrential *> concurrently io *> someOtherConcurrential c = someConcurrential *> sequentially io *> concurrently otherIo When running the term a, we are guaranteed that io/ is completed before any sequential part of someOtherConcurrential( is begun, but when running the term b, this is not the case; io: may be interleaved with or even run after any part of someOtherConcurrential . The term c# highlights an important point: concurrently otherIo' may be run before, during or after sequentially io\! The ordering through applicative combinators is guaranteed only among sequential terms. Create an IO which is run concurrently where possible, i.e. whenever it combined applicatively with other terms. For instance: \ a = concurrently io *> someConcurrential b = concurrently io >> someConcurrential When running the term a, the IO term io" will be run concurrently with someConcurrential, but not so in b/, because monadic composition has been used.The computation to run.The sequential part.The continuation; fst is sequential part, snd is value part. We use the rank 2 type for s because we really don't care what the value of the sequential part it, we just need to wait for it and then continue with >>.    3Handle all exceptions in Concurrential computation.(c) Alexander Vieth, 2015BSD3aovieth@gmail.com experimentalnon-portable (GHC only)NoneM +Make an arbitrary IO suitable for use with  sequentially or  concurrently/ so as to produce a term that can be run by  runSafely:let a = concurrently . safely $ dangerousComputation1 b = concurrently . safely $ dangerousComputation2 in runSafely $ a *> bRun a term such that computation is halted as soon as an exception is encountered, but any pending threads are waited on. The first exception to be thown (in term-order, not necessarily temporal order) is given as Left, and a Right is given if no exception is encountered.          !"Concurrential-0.2.1.0Control.Concurrent.Except Control.Concurrent.Concurrential'Control.Concurrent.Concurrential.SafelyExceptT runExceptTinjectEthrowEcatchE RetractorInjector ConcurrentialrunConcurrentialrunConcurrentialSimple sequentially concurrentlysafely runSafely$fMonadExceptT$fApplicativeExceptT$fFunctorExceptTChoicerunConcurrentialKSCApSCBindSCAtom Concurrent Sequential$fMonadConcurrential$fApplicativeConcurrential$fFunctorConcurrential$fFunctorChoiceinjector retractor