J'essaie de comprendre les transformateurs monad en mettant en œuvre ma propre petite bibliothèque basée sur les conceptions existantes.Quelles sont les extensions de langage requises par la bibliothèque MTL?
Ce sur quoi je suis bloqué, ce sont les extensions de langue. Dans MonadError, la seule extension mentionnée est UndecidableInstances
. Cependant, je ne peux pas obtenir un code similaire à compiler sans utiliser également FunctionalDependencies
et FlexibleInstances
.
exemple que je crois FunDeps exige:
class (Monad m) => MonadError e m | m -> e where
Et une instance souple:
instance MonadError e m => MonadError e (MaybeT m) where
Comment le code MonadError
éviter les deux extensions supplémentaires?
Note: Vous pouvez faire cela, mais beaucoup de gens préfèrent préciser les extensions avec 'Language' pragma dans chaque fichier. De cette façon, les fichiers peuvent être autonomes et ghci-able, et il est facile de voir quelles extensions chaque fichier utilise, car il n'est pas nécessaire d'activer chaque extension pour chaque fichier. Cela dépend des extensions que vous utilisez, et de façon omniprésente. – shachaf
@shachaf: Absolument. Bon point. Moi aussi, je préfère personnellement épeler chaque extension dans chaque fichier source qui les utilise. – shang
Les deux sont utiles. Je pense que l'approche recommandée devrait être d'épeler les extensions nécessaires par fichier en utilisant un pragma 'LANGUAGE', et d'enregistrer les extensions nécessaires pour un paquet dans le champ' other-extensions' de Cabal. La liste 'other-extensions' n'est pas activée par défaut, mais elle peut toujours servir à comprendre les exigences d'extension d'un paquet (sans avoir à regarder tous les fichiers source individuellement). – kosmikus