Одна из проблем с монадными трансформаторами, которые я нахожу, - это необходимость lift
операций в правую монаду. Единственный lift
здесь и там неплох, но иногда есть функции, которые выглядят так:
fun = do
lift a
lift b
c
lift d
lift e
f
Я хотел бы написать эту функцию таким образом:
fun = monadInvert $ do
a
b
lift c
d
e
lift f
Это уменьшает число lift
и очищает код.
Вопрос: для каких монад возможно monadInvert
? Как создать эту функцию?
Бонусные очки: определите его для monad m
, который является экземпляром MonadIO
.
Название этого вопроса говорит о перестановках: действительно, как мы можем иметь дело с произвольными перестановками стека трансформатора монады?