[Haskell-cafe] Using CatchIO on StateT

Gregory Collins greg at gregorycollins.net
Fri Oct 12 14:00:00 CEST 2012


On Fri, Oct 12, 2012 at 12:49 PM, Dmitry Vyal <akamaus at gmail.com> wrote:

> Greetings,
>
> I found The MonadCatchIO-mtl package while looking for a way to catch
> exceptions in my custom StateT s (ReaderT r IO) monad. CatchIO worked
> flawlessly when handlers used the environment r from Reader, but things
> broken when I tried to use state. According to source, the handler is run
> with the same state which was passed to runStateT.
>
> instance MonadCatchIO m => MonadCatchIO (StateT s m) where
>     m `catch` f = StateT $ \s -> (runStateT m s)
>                                    `Control.Monad.CatchIO.catch` (\e ->
> runStateT (f e) s)
>
> And my finalizing action depends on the current state. Can you give an
> advice how to get the behavior I need?
>

Catching an exception in IO is a non-local transfer of control from one
part of the program to another, and the only thing that is propagated is
the exception value itself. In general, given that the exceptional value
could be introduced to your thread from outside the execution context (i.e.
using "killThread"), it's not possible to save the updated state value. If
you wanted those semantics, you would need to use a side-effecting
reference like IORef.

G
-- 
Gregory Collins <greg at gregorycollins.net>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20121012/74408a1d/attachment.htm>


More information about the Haskell-Cafe mailing list