Глядя на документы для Control.Applicative
, я замечаю, что у них есть объявления экземпляров для определенных монад (например, IO
, Maybe
и, в частности, ST
), но экземпляров для MTL монады, такие как State
и RWS
. Вместо этого похоже, что определен тип общего назначения WrappedMonad
, который, как я предполагаю, должен охватывать все другие случаи.
Итак, вот мои вопросы:
Почему не существует Applicative
экземпляров для монад MTL? Лучший ответ, который я смог найти до сих пор, - это трехлетний пост , где кто-то реализовал эти случаи и был вкратце проигнорирован.
Что за сделка с WrappedMonad
? Я нашел сообщение на Reddit , которое кратко объясняет это, но я думаю, что я не понимаю, как его использовать.
В конечном итоге я хотел бы иметь возможность использовать State
в аппликативном стиле (как было рекомендовано ), но если мне придется засорять мой код конструкторами данных WrappedMonad
, тогда не похоже на победу. Я мог бы также полностью игнорировать WrappedMonad
и сам определять экземпляр Applicative
так же, как это было сделано для IO
, ST
и т. Д. В терминах return
и ap
... Но это кажется глупым.