Anatomie eines Monadentransformators

8

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:

  1. Basistyp ('Basis')

    • Monad-Instanz
  2. Übertragertyp ('BaseT')

    • Monad-Instanz

    • MonadTrans-Instanz

    • MonadIO-Instanz

  3. Transformatorklasse ('MonadBase')

    • einige Operationen

    • Instanzen für andere 'BaseT's

Also zum Beispiel für die Writer-Monade:

  • ein Writer-Datentyp / newtype / type mit einer Monad-Instanz
  • ein WriterT-Datentyp / newtype / type mit Monad-, MonadTrans- und MonadIO-Instanzen
  • eine MonadWriter-Klasse und Instanzen dieser Klasse für StateT, ReaderT, IdentityT, ...

Sind Monadetransformatoren so organisiert? Fehle ich irgendetwas / habe ich falsche Angaben?

Die Motivation für diese Frage ist herauszufinden:

  1. was sind die Beziehungen und Unterschiede zwischen den "BaseT" s und den entsprechenden "MonadBase" s und "Base" s
  2. ob alle drei benötigt werden
  3. wie MonadTrans verwandt ist und was sein Zweck ist
Matt Fenwick 28.11.2012, 16:19
quelle

1 Antwort

4

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:

%Vor%

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 .

    
Yuras 28.11.2012 17:40
quelle