В моем текущем проекте я столкнулся с необходимостью превратить различные монады в их трансформаторные аналоги, например.
stateT :: Monad m => State s a -> StateT s m a
stateT stf = StateT $ return . runState stf
Тривиально писать эти служебные функции для монад, которые мне нужны, но мне было интересно, существует ли уже библиотека, содержащая эту функциональность для стандартных монадов, и, возможно, класс стилей, который абстрагирует это преобразование. Что-то вроде
class (Monad f, MonadTrans t) => LiftTrans f t | f -> t where
liftT :: Monad m => f a -> t m a
( "лифт", вероятно, является неправильным термином для использования здесь, но я не был уверен, что еще назвать его.)