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