Я могу сделать StateP из Control.Proxy экземпляром MonadState?

Я изменяю некоторый код, который раньше запускался внутри StateT монада, чтобы бежать внутри StateP от Control.Proxy, Тем не менее, некоторые из моего кода (например, %= оператор из Control.Lens) требует MonadState пример. Безопасно / правильно ли для меня просто добавить такой экземпляр? Это похоже на то, что наиболее правильно обрабатывается библиотекой (в данном случае Control.Proxy).

1 ответ

Решение

Да, это безопасно. Экземпляр, который вы хотите:

instance (Monad m, Proxy p) => MonadState s (PS.StateP s p a' a b' b m) where
    get = PS.get
    put = PS.put

Я просто хочу кратко отметить, что в pipes-4.0.0 (который находится на Github) прокси-трансформаторы больше не нужны, и те же расширения передаются на аутсорсинг монадным трансформаторам в базовой монаде. Это означает, что вместо:

Consumer (StateP s p) a m r

... вы бы использовали:

Consumer a (StateT s m) r

Это означает, что тогда вы сможете написать:

lift $ myLens %= f

Тем не менее, я все еще планирую добавить MonadState случаи для Proxy в любом случае, хотя, возможно, в отдельном пакете (я еще не решил, включать ли их в основную библиотеку). Они бы выглядели так:

instance (MonadState s m) => MonadState s (Proxy a' a b' b m r) where
    put s = lift (put s)
    get   = lift get
Другие вопросы по тегам