This is because the Monad Transformer Library (MTL) recognizes that it is enough for you to mount monads in the usual way so that they do not define tell as some function (Mondoid w) => w -> Writer () .
Instead, they have a MonadWriter , which is defined as the type of the class, indicating how to function in it. Then they determine the ton of MonadWriter instances: ReaderT , IO , Writer (duh), etc. And that way you avoid the annoying repetition of lift. .
It is quite common that any monad transformer (in MTL) will have a Control.Monad.***.Class that has this typeclass type.
source share