Aufräumen von Monaden - Verwandeln der Anwendung eines Monadentransformators in eine neuartige Monade
Ich versuche, z.ExceptT a (StateT A M)
, für einen konkreten TypA
und MonadeM
, und wickeln Sie sie in meine neuen benutzerdefinierten Monaden.
uerst habe ich festgestellt, dassStateT A M
taucht oft in anderen Zusammenhängen auf und so habe ich beschlossen, dass es am besten ist, das alleine in eine Monade zu packenM1
und dann wickelnExceptT a M1
inM2
.
Die gewünschte Eigenschaft ist zu machenM1
undM2
Instanzen vonMonadState
und die Klasse vonM
(Nehmen wir an, es heißtMyMonadClass
). EbenfallsM2
sollte eine Instanz von @ seMonadError
.
Zunächst habe ich mit einfachen Synonymen angefangen:
type MyState = StateT A M
type MyBranch a = ExceptT a MyState
then Ich dachte, dass ich zuerst die Instanzdeklarationen skizzieren würde (ohne die Instanz zu implementieren) und das ist, wo ich zuerst stecken blieb.instance MonadState A (MyState)
schien nicht die richtige Syntax zu sein. Ich dachte, ich müsste @ erstellnewtype MyState' a = StateT a M
und danntype MyState = MyState A
(Lässt keine Spracherweiterungen verwenden, wo nicht erforderlich).
Jedoch einmal habe ich angefangen, die Synonyme in @ umzuwandenewtype
-Deklarationen Ich habe angefangen, die Verbindung zum @ zu verliereStateT A M
undExceptT ...
types.
newtype MyState' s a = MyState' { runMyState :: s -> (s, a) }
type MyState = MyState' A
newtype MyBranch e a = MyBranch { runMyBranch :: MyState (Either e a) }
Nun sind die bereits implementierten Transformatoren verschwunden und ich denke, ich versuche, etwas zu tun, das nicht viel Sinn ergibt. Meine Frage lautet also: Wie würde man diese Art von Verhalten korrekt in neue zusammengesetzte Monaden einwickeln, die die darunter liegenden Schichten zugänglich machen, so dass unnötiges Heben vermieden wird und die Dinge klar und gut organisiert bleiben.