Sto modificando del codice che è stato eseguito all'interno di una monad StateT
da eseguire all'interno di StateP
da Control.Proxy
. Tuttavia, parte del mio codice (ad esempio l'operatore %=
da Control.Lens
) richiede un'istanza MonadState
. È sicuro/corretto per me aggiungere solo un'istanza del genere? Questo sembra qualcosa che è gestito correttamente da una libreria (in questo caso, Control.Proxy
).posso creare StateP da Control.Proxy un'istanza di MonadState?
5
A
risposta
4
Sì, questo è sicuro. L'istanza che si desidera è:
instance (Monad m, Proxy p) => MonadState s (PS.StateP s p a' a b' b m) where
get = PS.get
put = PS.put
Voglio solo ricordare brevemente che a pipes-4.0.0
(che è su Github) trasformatori del proxy non sono più necessari e le stesse estensioni sono affidati a Monade trasformatori monade base. Ciò significa che invece di:
Consumer (StateP s p) a m r
... si usa:
Consumer a (StateT s m) r
Questo significa che si dovrebbe quindi solo essere in grado di scrivere:
lift $ myLens %= f
Tuttavia, ho ancora pianificare l'aggiunta di istanze MonadState
per Proxy
in ogni caso, anche se forse in un pacchetto separato (non ho ancora deciso se includerle ancora nella libreria principale). Sembrerebbero così:
instance (MonadState s m) => MonadState s (Proxy a' a b' b m r) where
put s = lift (put s)
get = lift get
molte grazie! tuttavia, questo sembra non essere del tutto corretto - Ottengo il seguente errore: – ajp
'Tipo mis-match Il secondo argomento di 'MonadState' dovrebbe avere tipo '* -> *', ma 'Proxy a' ab 'bmr' ha gentile '*' Nella dichiarazione di istanza per 'MonadState s (Proxy a' ab 'bmr)' ' – ajp
rimuovendo' r' dal tipo Proxy corregge il tipo, ma poi ne fornisce un altro su una dichiarazione di istanza illegale – ajp