Работа над стеком преобразователей монад с перестановками

Одна из проблем с преобразователями монад, которые я нахожу, - это необходимость поднять операции вправо. монада.Один лифт кое-где неплохо, но иногда встречаются функции, которые выглядят так:

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 .

Название этого вопроса говорит о перестановках: действительно, как мы можем иметь дело с произвольными перестановками стека преобразователей монад?

15
задан Matt Fenwick 28 November 2012 в 14:39
поделиться