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?
5
A
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
vielen dank! dies scheint jedoch nicht ganz korrekt zu sein - ich erhalte den folgenden Fehler: – ajp
'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
Entfernen der' r' vom Proxy-Typ behebt die Art, aber dann gibt eine andere über eine illegale Instanz Deklaration – ajp