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.
Nur Transformatoren für Status und Alternierung ( ExceptT
und MaybeT
) benötigen eine zugrunde liegende Monade für die Applicative
-Instanz.
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.
Wo ist die Klasse für Applicative
transformers?
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
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.
local
kann ohne eine Monad
-Instanz sehr schwer zu verwenden sein. Eine nützlichere Schnittstelle ohne die Einschränkung Monad
wäre etwas wie
Gibt es irgendwo Transformatoren-Klassen, die die Monad
Einschränkung nicht haben, oder braucht es noch eine weitere Transformator-Klassenbibliothek?
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:
Data.Functor.Compose
Data.Functor.Product
Data.Functor.Constant
Data.Functor.Identity
Control.Applicative.Lift
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:
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%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
Die Einschränkung der Monad-Superklasse ist praktisch. Ich bin mir nicht sicher, ob es aber absolut notwendig ist.
Tags und Links haskell applicative monad-transformers