Ich versuche, Monad-Transformatoren zu verstehen, indem ich meine eigene kleine Bibliothek basierend auf den Entwürfen von existierenden implementiere.Welche Spracherweiterungen benötigt die MTL-Bibliothek?
Woran ich festhalte, sind die Spracherweiterungen. In MonadError ist die einzige Erweiterung, die erwähnt wird, UndecidableInstances
. Allerdings kann ich keinen ähnlichen Code kompilieren, ohne auch FunctionalDependencies
und FlexibleInstances
zu verwenden.
Beispiel, dass ich glaube, erfordert FunDeps:
class (Monad m) => MonadError e m | m -> e where
und eine flexible Beispiel:
instance MonadError e m => MonadError e (MaybeT m) where
Wie funktioniert der MonadError
Code die zusätzlichen zwei Erweiterungen zu vermeiden?
Hinweis: Sie können dies tun, aber viele Leute bevorzugen Erweiterungen mit 'LANGUAGE' Pragmas in jeder Datei zu buchstabieren. Auf diese Weise können Dateien eigenständig und ghci-fähig sein, und es ist einfach zu sehen, welche Erweiterungen jede bestimmte Datei verwendet, da Sie nicht jede Erweiterung für jede einzelne Datei aktivieren müssen. Es hängt davon ab, welche Erweiterungen Sie verwenden und wie durchgängig. – shachaf
@shachaf: Absolut. Guter Punkt. Auch ich persönlich bevorzuge es, jede Erweiterung in jeder Quelldatei, die sie verwendet, zu buchstabieren. – shang
Beide sind nützlich. Ich denke, der empfohlene Ansatz sollte darin bestehen, Erweiterungen nach Bedarf pro Datei mit Hilfe eines 'LANGUAGE'-Pragmas zu buchstabieren und die benötigten Erweiterungen für ein Paket in Cabals 'Other-Extensions'-Feld aufzuzeichnen. Die 'Other-extensions'-Liste ist nicht standardmäßig aktiviert, kann aber immer noch dazu dienen, zu verstehen, welche Erweiterungsanforderungen ein Paket hat (ohne dass alle Quelldateien einzeln betrachtet werden müssen). – kosmikus