Я могу сделать 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