Аппликативный экземпляр для State и других монад MTL?

Глядя на документацию для Control.Applicative , я заметил, что в них есть объявления экземпляров для определенных монад (например, ] IO , Возможно и особенно ST ), но нет экземпляров для монад MTL, таких как State и RWS . Вместо этого похоже, что определен универсальный тип WrappedMonad , который, как я предполагаю, должен охватывать все остальные случаи.

Итак, вот мои вопросы:

  1. Почему нет аппликативных экземпляров для монад MTL? Лучший ответ, который я смог найти самостоятельно, - это сообщение трехлетней давности , в котором кто-то реализовал эти экземпляры и был в целом проигнорирован.

  2. Что такое WrappedMonad ? Я нашел сообщение на Reddit , в котором это кратко объясняется, но я думаю, что не понимаю, как его использовать.

В конечном итоге я хотел бы иметь возможность использовать State в аппликативном стиле (как было рекомендовано мне ), но если мне придется засорять свой код WrappedMonad конструкторы данных, то это не похоже на победу. Я также мог полностью игнорировать WrappedMonad и сам определять экземпляр Applicative так же, как это было сделано для IO , ST и т. Д. : с точки зрения return и ap ... Но это тоже кажется глупым.

6
задан Community 23 May 2017 в 12:25
поделиться