Я пытался написать свои собственные монадные преобразователи, в которых было бы целесообразно иметь несколько одинаковых монадных преобразователей в стеке с разными типами. Вопрос может быть проиллюстрирован монадой читателя.
Монада чтения предлагается как способ удержания контекста только для чтения данного типа
ex1 :: Reader Bool Bool
ex1 = ask
или
ex2 :: Reader Char Bool
ex2 = pure True
монадные трансформаторы допускают менее строгие предположения о подчеркивающей монаде
ex3 :: (MonadReader Bool m) => m Bool
ex3 = ask
однако, что если я хочу иметь более 1 среды только для чтения, я могу написать функцию типа
ex4 :: (MonadReader Bool m, MonadReader Char m) => m Bool
ex4 = ask
Однако, насколько я могу судить, нет способа запустить ex4 с
class Monad m => MonadReader r m | m -> r
Означает, что каждый MonadReader имеет уникальный тип чтения. Существует ли стандартная обходная схема для нескольких трансформаторов в одном стеке? Должен ли я попытаться избежать этого полностью?