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