Difference between `MonadBaseControl` and `MonadCatch`?

Exceptions provided by base work only in IO. I know of two generalizations of these exceptions to other monads:

They seem to be doing the same thing. MonadBaseControl is more grand. but I do not follow how that grandeur is motivated. I used each of them once or twice and I did not see any difference.

Is there a clear cut best practice for when to use one or the other?

I prefer to use MonadCatch where possible because MonadBaseControl is much more than just the ability to catch errors. There are many more things you can do if you have MonadBaseControl, not all of which are universally agreed to be a good idea (e.g., see lifted-base, which provides a lot of stuff using MonadBaseControl, like the ability to fork threads)

1 Like

There’s also

For monads isomorphic to ReaderT over IO.

1 Like