NOOB Haskell
Еще заметка из разряда магии хаскеля (для нубов). Делаем функцию rrr :: ErrorT ... Writer ..., внутре ее пишем какие-нибудь вычисления, ну там throwError ...
tell ... return ... Можем вычислить результат через runErrorT $ runWriter. Все понятно и доступно. А теперь меняем сигнатуру на rrr :: WriterT ... ErrorT ... Identity ... и БОЛЬШЕ НИЧЕГО!!! Работает, сцуко! Только теперь нужно использовать runIdentity $ runErrorT $ runWriter ... Бля, только изменением типа нашего вычисления МЫ ЕГО ВЫВЕРНУЛИ НАИЗНАНКУ! Да за меньшее в Средние Века на костре сжигали.
А "виной" всему тут хитрожопая машинерия библиотеки mtl, где ErrorT и WriterT являются инстансами как MonadWriter, так и MonadError.