Во многих случаях мне непонятно, что нужно делать, комбинируя две монады с трансформатором, а не используя две отдельные монады. Очевидно, что использование двух отдельных монадов - это хлопот и может включать запись внутри внутри обозначений, но есть ли случаи, когда это просто недостаточно выразительно?
Один случай, как представляется, является StateT on List: объединение монад не дает вам нужного типа, и если вы получите правильный тип через стек монад вроде Bar (где Bar a = (Reader r (List (Writer) w (Идентификация a))), она не делает правильные вещи.
Но я хотел бы получить более общее и техническое представление о том, какие трансформаторы монады приносят в таблицу, когда они есть и не нужны, и почему.
Чтобы сделать этот вопрос немного более сосредоточенным:
- Каков фактический пример монады без соответствующего трансформатора (это поможет проиллюстрировать, что могут сделать трансформаторы, которые не могут просто укладывать монады).
- Являются ли StateT и ContT единственными трансформаторами, которые дают тип, не эквивалентный их составу с m, для лежащей в основе монады m (независимо от того, какой порядок они составлены.)
(Меня не интересуют конкретные детали реализации в отношении разных вариантов библиотек, а скорее общий (и, вероятно, независимый от Haskell) вопрос о том, какие монады-трансформаторы/морфизмы добавляют в качестве альтернативы объединению эффектов, складывая кучу конструкторы монадического типа.)
(Чтобы дать небольшой контекст, я лингвист, который делает проект, чтобы обогатить грамматику Монтегю - просто набрал лямбда-исчисление для составления значений слов в предложениях - с помощью стека трансформатора монады. Было бы действительно полезно понять, являются ли трансформаторы на самом деле делают что-нибудь полезное для меня.)
Спасибо,
Реубен