7

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?

Antwort

11

Sie müssen nicht alle Erweiterungen in der Quelldatei selbst buchstabieren. Gemeinsame Erweiterungen, die von allen/den meisten Modulen verwendet werden, können in der Cabal-Datei des Projekts aufgeführt werden. In mtl's case:

extensions: 
    MultiParamTypeClasses 
    FunctionalDependencies 
    FlexibleInstances 
+7

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

+1

@shachaf: Absolut. Guter Punkt. Auch ich persönlich bevorzuge es, jede Erweiterung in jeder Quelldatei, die sie verwendet, zu buchstabieren. – shang

+2

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