Аппликативный экземпляр для государственных и других MTL монад? - PullRequest
6 голосов
/ 03 ноября 2011

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

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 03 ноября 2011

Эта документация генерируется исключительно на основе содержимого пакета base, который не содержит State - поэтому он не содержит Applicative экземпляров для него.Если вы посмотрите в документацию MTL , вы увидите список Applicative в списке.

В качестве альтернативы вы можете открыть GHCi, импортировать Control.Monad.State и Control.Applicative,и используйте :i Applicative, чтобы перечислить экземпляры Applicative или :i StateT, чтобы перечислить классы, для которых StateT имеет экземпляры (State - псевдоним типа для StateT с фиксированным одним из его параметров).Любой из них покажет, что такой случай действительно существует.

2 голосов
/ 03 ноября 2011

Аппликативные экземпляры для монад mtl не могут быть перечислены в базовых документах, потому что в этот момент нет доступных mtl.Хорошая новость заключается в том, что у mtl есть экземпляры Applicative StateT, например , начиная с mtl-2.0.0.0.

...