В сопряженных функторах определяют монадные трансформаторы, но где поднять? Саймон С показал нам конструкцию...
newtype Three u f m a = Three { getThree :: u (m (f a)) }
... которому, как обсуждают ответы, может быть дан instance Adjunction fu => MonadTrans (Three uf)
( AdjointT
предоставляют его как AdjointT
). Таким образом, любое присоединение Hask/Hask приводит к монадному преобразователю; в частности, StateT s
возникает таким образом из каррирующего соединения между (,) s
и (->) s
.
Мой следующий вопрос: обобщает ли эта конструкция другие монадные трансформаторы? Есть ли способ извлечь, скажем, другие трансформаторы из пакета трансформаторов из подходящих дополнений?
Мета замечания: мой ответ здесь изначально был написан для вопроса Саймона С. Я решил включить его в вопрос с самостоятельным ответом, потому что, перечитывая этот вопрос, я заметил, что мой предполагаемый ответ больше связан с обсуждением в комментариях, чем с самим телом вопроса. Два других тесно связанных вопроса, к которым эти вопросы и ответы, вероятно, также являются продолжением: есть ли монада, у которой нет соответствующего монадного преобразователя (кроме IO)? и всегда ли композиция произвольной монады с проходимым монадой?