I'm trying to understand monad transformers by implementing my own tiny library based on the designs of existing ones.
What I'm stuck on is the language extensions. In MonadError, the only extension mentioned is UndecidableInstances
. However, I can't get similar code to compile without also using FunctionalDependencies
and FlexibleInstances
.
Example that I believe requires FunDeps:
class (Monad m) => MonadError e m | m -> e where
And a flexible instance:
instance MonadError e m => MonadError e (MaybeT m) where
How does the MonadError
code avoid the extra two extensions?
LANGUAGE
pragmas in each file. That way files can be standalone and ghci-able, and it's easy to see what extensions each particular file is using, since you don't need to turn on every extension for every single file. It depends on which extensions you're using, and how pervasively. – Sniper