Ich versuche, Monade-Transformatoren zu lernen, basierend auf den Standard-Haskell-Bibliotheken (mtl? Transformatoren? nicht sicher, welche kam mit meinem Download der Haskell-Plattform - 7.4.1).
Was ich glaube, ich habe bemerkt, ist eine gemeinsame Struktur für jede Monadetransformatordefinition:
Basistyp ('Basis')
Übertragertyp ('BaseT')
Monad-Instanz
MonadTrans-Instanz
MonadIO-Instanz
Transformatorklasse ('MonadBase')
einige Operationen
Instanzen für andere 'BaseT's
Also zum Beispiel für die Writer-Monade:
Sind Monadetransformatoren so organisiert? Fehle ich irgendetwas / habe ich falsche Angaben?
Die Motivation für diese Frage ist herauszufinden:
mtl
package implementiert keine Monade-Transformer. Wenigstens ist WriterT nur reexported von transformers
.
transformers
package implementiert WriterT
, welches selbst ein Transformer ist. Writer
ist nur ein Alias:
Einige Bibliotheken können Writer
separat implementieren, aber es ist nur ein Sonderfall von WriterT
. ( Identity
ist eine triviale Monade, sie hat kein zusätzliches Verhalten.)
MonadTrans
ermöglicht es Ihnen, die zugrunde liegende Monade in die transformierte einzubinden. Sie können ohne es leben, aber Sie müssen manuelle Umbruch durchführen (siehe MonadTrans
Instanzdefinition für WriterT
zum Beispiel wie es geht). Der einzige Anwendungsfall, in dem Sie MonadTrans
wirklich benötigen - wenn Sie den tatsächlichen Typ des Transformators nicht kennen.
MonadWriter
ist eine Typklasse, die in mtl
deklariert ist. Die Methoden ( writer
, pass
, tell
und listen
) sind identisch mit der Funktion für WriterT
. Es erlaubt (automatisch!)% Co_de% Berechnung durch Stapel von Transformatoren zu wickeln, auch wenn Sie nicht wissen, genaue Arten (und sogar Anzahl!) Von Transformatoren im Stapel.
Also, WriterT
ist der einzige Typ, der "erforderlich" ist.
Für andere Monadetransformatoren ist das gleich: WriterT
ist ein Transformer, BaseT
ist eine Monade ohne zugrundeliegende Monade und Base
ist eine Typklasse - Klasse aller Monaden, die irgendwo MonadBase
haben Transformatoren Stapel.
HINZUGEFÜGT:
Sie finden tolle Erklärungen im RWH-Buch
Hier ist ein einfaches Beispiel:
%Vor% Beachten Sie, dass BaseT
vom Compiler abgelehnt wird (versuchen Sie es, um die Fehlermeldung zu sehen!). Aber (I)
kompiliert, dank (II)
("explizite Aufhebung"). Dank MonadTrans
funktioniert MonadReader
out of the box ("implizites lifting"). Bitte lesen Sie RWH-Buch für die Erklärung, wie es funktioniert.
(Im Beispiel importieren wir (III)
aus zwei verschiedenen Modulen, deshalb brauchen wir einen qualifizierten Import. Normalerweise verwenden Sie jeweils nur einen davon.)
Ich wollte auch nicht speziell nach
ask
fragen.
Nicht sicher, dass ich verstehe ... Writer
, Reader
und andere verwenden dasselbe Schema. Ersetzen Sie State
durch Writer
und Sie erhalten eine Erklärung für State
.
Tags und Links haskell monads monad-transformers