2013-06-23 10 views
5

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?

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 
+0

molte grazie! tuttavia, questo sembra non essere del tutto corretto - Ottengo il seguente errore: – ajp

+0

'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

+0

rimuovendo' r' dal tipo Proxy corregge il tipo, ma poi ne fornisce un altro su una dichiarazione di istanza illegale – ajp