Hackage propose plusieurs packages pour les transformateurs monades:
- mtl : bibliothèque de transformateurs Monad
- transformateurs : foncteur béton et transformateurs monades
- monads-fd : classes Monad, utilisant des dépendances fonctionnelles
- monads-tf : classes Monad, utilisant des familles de types
- monadLib : une collection de transformateurs monad .
- mtl-tf : bibliothèque de transformateurs Monad utilisant des familles de types.
- mmtl : bibliothèque de transformateurs modulaires Monad
- mtlx : bibliothèque de transformateurs Monad avec index de types, fournissant des copies «gratuites».
- compose-trans : transformateurs monades composables
(et peut-être que j'en ai manqué)
Lequel utiliserons-nous?
mtl est celui de la plate-forme Haskell, mais j'entends constamment sur reddit que ce n'est pas cool.
Mais ce qui est mauvais dans le choix de toute façon, n'est-ce pas juste une bonne chose?
Eh bien, j'ai vu comment, par exemple, les auteurs de l'accès aux données ont dû faire tout cela pour répondre uniquement aux choix populaires:
- bibliothèque data-accessor-monadLib: fonctions d'accesseur pour les monades de monadLib
- bibliothèque data-accessor-monads-fd: utilisez Accessor pour accéder à l'état dans la classe de monade d'état monads-fd
- bibliothèque data-accessor-monads-tf: utilisez Accessor pour accéder à l'état dans la famille de types monades d'état monads-tf
- bibliothèque data-accessor-mtl: utilisez Accessor pour accéder à l'état dans la classe mtl State monad
- bibliothèque data-accessor-transformers: utilisez Accessor pour accéder à l'état dans les transformateurs State monad
J'imagine que si cela continue et que par exemple plusieurs packages Arrow concurrents évoluent, nous pourrions voir quelque chose comme: spoonklink-arrows-transformers, spoonklink-arrows-monadLib, spoonklink-tfArrows-transformers, spoonklink-tfArrows-monadLib, ...
Et puis je crains que si spoonklink se fourche, Hackage manquera d'espace disque. :)
Des questions:
- Pourquoi y a-t-il autant de packages de transformateurs monades?
- Pourquoi mtl [considéré] n'est-il pas cool?
- Quelles sont les principales différences?
- La plupart de ces packages apparemment concurrents ont été écrits par Andy Gill et sont maintenus par Ross Paterson. Cela signifie-t-il que ces packages ne sont pas concurrents mais fonctionnent plutôt ensemble d'une manière ou d'une autre? Et Andy et Ross considèrent-ils l'un de leurs propres packages comme obsolète?
- Lequel devrais-tu et moi utiliser?
la source
Réponses:
Un certain nombre d'entre eux sont presque complètement équivalents:
mtl
utilise les extensions GHC, maistransformers
c'est Haskell 98.monads-fd
etmonads-tf
sont des add-ons àtransformers
, utilisant respectivement des dépendances fonctionnelles et des familles de types, tous deux fournissant les fonctionnalitésmtl
manquantes detransformers
.mtl-tf
estmtl
réimplémenté à l'aide de familles de types.Donc, essentiellement,
mtl
==transformers
++monads-fd
,mtl-tf
==transformers
++monads-tf
. La portabilité et la modularité améliorées detransformers
et de ses packages associés expliquent pourquoi cemtl
n'est pas cool de nos jours, je pense.mmtl
et lesmtlx
deux semblent similaires et / ou basés surmtl
, avec des différences d'API et des fonctionnalités supplémentaires.MonadLib
semble avoir une vision assez différente des choses, mais je ne la connais pas directement. Semble également utiliser beaucoup d'extensions GHC, plus que les autres.En un coup d'œil, cela
compose-trans
ressemble plus à une métaprogrammation pour créer des transformateurs monades. Il prétend être compatible avecControl.Monad.Trans
lequel ... je suppose que ça veut diremtl
?En tout cas, je suggère l'algorithme de décision suivant:
transformers
& co., Aidez-nous à nousmtl
reposer.mtl
dans un grand projet?transformers
n'est pas complètement compatible, mais personne ne vous tuera pour ne pas avoir changé.category-extras
et résolvez tous les problèmes du monde avec une page et demie de code génériqueincompréhensible et abstrait àcouper le souffle.la source
Pour le moment? Vous devriez probablement utiliser
mtl
. Ce qui se passe, c'est que latransformers
bibliothèque est exclue de la MTL d'une manière quimonads-fd
etmonads-tf
peut coexister pacifiquement, mais enfin vérifier que ce n'était pas encore le cas.Lorsque cela se produit, vous pourrez importer
monads-fd
ettransformers
obtenir (presque) la même interface, sauf queState
, etc. sera un alias pourStateT
.J'écrirais donc
mtl
, mais je ne me fierais pas au fait que l'État, le lecteur, etc. sont actuellementdata
tels qu'ils seront remplacés par l'type
art.MonadLib
est une autre alternative sur laquelle Iavor a travaillé, qui peut être utilisée en toute sécurité car elle ne partage aucun nom de module avec les autres, mais qui a un modèle d'utilisation assez différent.la source
transformers
& co. encore, mais n'a pas remarqué de problèmes autres que quelques différences mineures d'API par rapportmtl
au changement de code (assez simple).L'affacturage mentionné par Edward Kmett dans sa réponse a été achevé à la fin de 2010. Son résultat final a été monads-fd , construit sur des transformateurs , devenant la version 2 de mtl . En raison de l'omniprésence de mtl , les monades-tf n'ont jamais vraiment fait leur chemin . Au début de 2017, MTL et les transformateurs sont les seules bibliothèques de transformateurs monades à être largement utilisées.
la source