2014-09-13 10 views

Antwort

14

Es gibt eine funktionale Änderung. ErrorT erfordert, dass der e-Typ ein Mitglied der Error type class-Beispiel sein, z. B. seine Monad Instanz Einschränkungen berücksichtigen. Dies ist ziemlich willkürlich und wird für die Funktionalität von ErrorT sicherlich nicht benötigt.

ExceptT hebt diese Einschränkung auf.

Die Umbenennung wurde eingeführt, um einen reibungsloseren Upgrade-Pfad zu erstellen. Personen, die derzeit die Error Einschränkung in ihren ErrorT Stapeln verwenden und davon abhängen, sollten den Code nicht ändern müssen. Personen, die das strengere allgemeine Modul ExceptT verwenden möchten, können dies frei wählen. Irgendwann kann das ErrorT Modul entfernt werden.

3

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.

+0

Ein ye ne'er Anruf 'fail', ye'll finden diese Schwierigkeit nie. – dfeuer

+0

Das ist einfach nicht wahr. GHC ruft implizit auch fehl, wenn eine Musterübereinstimmung fehlschlägt: –

+0

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. –