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 M1inM2.

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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage