Es gibt eine Änderung in der Semantik.
ErrorT e m
erwartet, dass e
die Klasse Error
in seiner Monad
Instanz implementiert. Dies ermöglicht die Implementierung von fail
für ErrorT e m
eine Ausnahme zu werfen:
fail msg = ErrorT $ return (Left (strMsg msg))
Im Gegensatz dazu ExceptT
keine solche Einschränkung machen. Stattdessen wird die Implementierung von fail
für ExceptT e m
ruft die Ausnahme in dem zugrunde liegenden Monade m
:
fail = ExceptT . fail
Ich ziehe ErrorT
‚s Verhalten, da es mir jede Instanz fangen kann, wo fail
von Code über eine generische Monade genannt wird. In jedem Fall ist es wichtig, Ihren Code vor dem Umbenennen von ErrorT
zu ExceptT
zu überprüfen.
Ein ye ne'er Anruf 'fail', ye'll finden diese Schwierigkeit nie. – dfeuer
Das ist einfach nicht wahr. GHC ruft implizit auch fehl, wenn eine Musterübereinstimmung fehlschlägt: –
Als eine Nebenbemerkung schreibe ich viel Haskell-Code, und ich neige dazu, den Typchecker häufig zu verwenden, um Fehler abzufangen. Zum Schlechten oder Schlechten, Scheitern ist ein Teil von Monad. Ich finde es schrecklich, dass ein Bibliotheksverwalter Abnutzungswarnungen ausgibt, die Änderungen empfehlen, die den Anwendungscode stillschweigend zerstören, weil sie die Semantik einer Operation auf subtile und schlecht dokumentierte Weise geändert haben. –