Anwendbare Transformatorklassen

8

Wo sind die Umwandlungsklassen Applicative ? Ich wollte in einer früheren Antwort Übertragungsklassen für den anwendbaren Transformatorstapel verwenden , aber sie scheinen nicht zu existieren.

Die Transformatoren und viele andere sind voll von Transformatoren, die die Struktur Applicative beibehalten, selbst wenn die zugrundeliegende Struktur isn ist 't a Monad .

Ein kurzer Blick auf transformers hat Applicative Instanzen für die meisten Transformatoren.

%Vor%

Nur Transformatoren für Status und Alternierung ( ExceptT und MaybeT ) benötigen eine zugrunde liegende Monade für die Applicative -Instanz.

%Vor%

Es gibt eine Klasse für Monad transformers. Ich kann sehen, wie etwas diese Einschränkung Monad erfordern könnte, da es nicht anderswo eingeführt werden kann.

%Vor%

Wo ist die Klasse für Applicative transformers?

%Vor%

Oder einfach nur alte Transformatoren (obwohl ich mir dafür keine Gesetze vorstellen kann)?

%Vor%

Wegen des Unterschieds nur in polymorphen Bedingungen haben diese Typklassen ein seltsames Varianzmuster. Abgesehen von ihren Gesetzen, die unvorhergesehene Einschränkungen berücksichtigen müssen, sollte alles, was eine Instanz von Trans ist, automatisch eine Instanz von ApTrans und MonadTrans sein, und alles, was eine Instanz von ApTrans ist, sollte automatisch eine Instanz von sein MonadTrans .

Wenn wir uns zur mtl -Bibliothek begeben, sind die Klassen dort auch nicht kompatibel mit einem Applicative -Transformator-Stack. Alle mir bekannten mtl Klassen haben eine Monad Einschränkung. Zum Beispiel, hier ist MonadReader

%Vor%

Was ist der Zweck der Einschränkung Monad ? Es macht MonadReader und die MonadReader Instanzen für viele der obigen Transformatoren inkompatibel mit Applicative transformator stacks.

Ich würde naiv etwas schreiben wie

%Vor%

oder spalte local in eine separate Klasse.

%Vor%

local kann ohne eine Monad -Instanz sehr schwer zu verwenden sein. Eine nützlichere Schnittstelle ohne die Einschränkung Monad wäre etwas wie

%Vor%

Gibt es irgendwo Transformatoren-Klassen, die die Monad Einschränkung nicht haben, oder braucht es noch eine weitere Transformator-Klassenbibliothek?

    
Cirdec 12.09.2014, 00:54
quelle

2 Antworten

5

Wie J. Abrahamson sagte, sind die Anwendungsbereiche unter den Produkten und der Zusammensetzung geschlossen, so dass keine dedizierten Transformatorversionen erforderlich sind. Es ist jedoch auch nicht nötig, eigene anwendungsspezifische Produkt- / Zusammensetzungstypen zu rollen, da die Plattform bereits diese enthält:

Ich habe festgestellt, dass der einfachste Weg, diese zu verwenden, in der Erweiterung GeneralizedNewtypeDeriving liegt, weil Sie dann einfach Typen wie diese definieren können:

%Vor%

Ein weiteres nützliches Werkzeug im Applicative-Toolset ist der freie applikative Funktor. Normalerweise verwende ich Edward Kmetts free -Bibliotheksversion , aber es ist einfach um eigene zu rollen, wenn Sie weniger Abhängigkeiten wünschen.

Diese Definitionen können auch nützlich sein (obwohl ich Vorschläge zum Benennungsschema, insbesondere das "I / O" -Bit begrüßen würde):

%Vor%     
Luis Casillas 12.09.2014, 22:04
quelle
9

Applicative sind im Gegensatz zu Monads unter Produkten und Zusammensetzung geschlossen und benötigen daher keine spezielle Klasse von Dingen wie "Transformatoren". Hier ist eine kleine Bibliothek:

%Vor%

Außerdem sind alle Monaden -Anwender, daher sollten wir in der Lage sein, diesen Code wiederzuverwenden. Leider zwingt das Fehlen von Subtyping von Applicative-Monad dazu, dass monadischer Code mehr Ausgrenzung erfordert als nötig und damit einen solchen Code verbietet. Es hätte behoben werden können, wenn alle diese Bibliotheken nach einer (Applicative m, Monad m) Einschränkung fragen würden, aber das tun sie nicht. Außerdem, wie oft man sonst schreiben müsste

%Vor%

Die Einschränkung der Monad-Superklasse ist praktisch. Ich bin mir nicht sicher, ob es aber absolut notwendig ist.

    
J. Abrahamson 12.09.2014 01:59
quelle