Ich verbringe die Hälfte meines Tages damit, herauszufinden, wie ich EdetT verwenden kann, um mit Fehlern in meinem Code umzugehen.
Ich habe einen Transformator-Stack wie diesen definiert.
%Vor% Das funktioniert ganz gut, solange ich nur die Funktionen ReaderT
und StateT
verwende. Ich habe den Eindruck, dass ich jetzt so etwas schreiben könnte:
Wichtiger ist die Erfassung von Either
Rückgabewerten, die mit hoistEither
aus dem errors
Paket möglich sein sollten:
Ich lese das Kapitel real world haskell über Monad-Transformatoren und spiele mit lift
herum. Aber ich kann nichts zum Typcheck bekommen.
Der Grund, warum Sie die Funktionen left
und hoistEither
nicht direkt verwenden können, ist, dass im Gegensatz zu StateT
und ReaderT
von der mtl
Paket, das Paket either
bietet keine Typklasse wie MonadReader
oder MonadState
.
Die oben genannten Klassen sorgen dafür, dass der Monadenstapel transparent angehoben wird, aber für EitherT
müssen Sie selbst heben (oder schreiben Sie eine MonadEither
Typklasse ähnlich wie MonadReader
).
Zuerst müssen Sie den Stuff
-Wrapper anwenden, dann lift
auf den ReaderT
-Transformator und dann lift
erneut auf den StateT
-Transformator.
Wahrscheinlich möchten Sie Utility-Funktionen für sich schreiben, wie zum Beispiel
%Vor%Dann kannst du es einfach so benutzen:
%Vor% Alternativ können Sie Control.Monad.Error
mtl
, wenn Sie eine Error
-Instanz für Text
definieren.
Jetzt können Sie die Definition von Stuff
implementieren left
und hoistEither
wie folgt ändern:
Damit wird Ihre ursprüngliche faultyFunction
-Typ-Prüfung ohne manuelle Aufhebung durchgeführt.
Sie können auch generische Implementierungen für left
und hoistEither
schreiben, die für jede Instanz von MonadError
(mit either
von Data.Either
) funktionieren:
Nur zur Antwort von shang: MonadError
ist im Grunde die entsprechende Typklasse zu EitherT
. Sie können ihre Instanz für EitherT
hinzufügen (aus irgendeinem Grund ist sie in der either
-Bibliothek auskommentiert):
Definieren Sie dann Ihre eigenen Methoden, die auf MonadError
:
Jetzt können Sie Dinge tun wie:
%Vor%oder generalisieren Sie es auf
%Vor%Tags und Links haskell error-handling either monad-transformers