2013-06-23 6 views
5

Ich ändere einen Code, der innerhalb einer StateT Monade innerhalb von StateP von Control.Proxy ausgeführt wurde. Jedoch erfordert ein Teil meines Codes (z. B. der %=-Operator von Control.Lens) eine MonadState Instanz. Ist es sicher/richtig, dass ich eine solche Instanz hinzufüge? Dies scheint etwas zu sein, das am besten von einer Bibliothek gehandhabt wird (in diesem Fall Control.Proxy).kann ich StateP von Control.Proxy eine Instanz von MonadState machen?

Antwort

4

Ja, das ist sicher. Die Instanz, die Sie wollen, ist:

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

Ich möchte nur kurz zu beachten, dass in pipes-4.0.0 (die auf Github ist) die Proxy-Transformatoren sind nicht mehr notwendig und die gleichen Erweiterungen ausgelagert werden Transformatoren in der Basis Monade Monade. Dies bedeutet, dass statt:

Consumer (StateP s p) a m r 

... Sie verwenden würden:

Consumer a (StateT s m) r 

Das bedeutet, dass Sie würde dann nur in der Lage sein, zu schreiben:

lift $ myLens %= f 

Allerdings habe ich immer noch Plan auf Hinzufügen MonadState Instanzen für Proxy sowieso, obwohl vielleicht in einem separaten Paket (ich habe immer noch nicht entschieden, ob sie in der Hauptbibliothek noch enthalten). Sie würden so aussehen:

instance (MonadState s m) => MonadState s (Proxy a' a b' b m r) where 
    put s = lift (put s) 
    get = lift get 
+0

vielen dank! dies scheint jedoch nicht ganz korrekt zu sein - ich erhalte den folgenden Fehler: – ajp

+0

'Art mis-match Das zweite Argument von 'MonadState' sollte die Art '* -> *' haben, , aber 'Proxy a' ab 'bmr' hat Art '*' In der Instanz Deklaration für 'MonadState s (Proxy ein' ab 'bmr)' ' – ajp

+0

Entfernen der' r' vom Proxy-Typ behebt die Art, aber dann gibt eine andere über eine illegale Instanz Deklaration – ajp