84 votes

mtl, les transformateurs, les monades-fd, monadLib, et le paradoxe du choix

Hackage a plusieurs paquets pour monade transformers:

  • mtl: Monade transformateur de la bibliothèque
  • transformers: Béton foncteur et de l'errance de transformateurs
  • les monades-fd: Monade classes, en utilisant des dépendances fonctionnelles
  • les monades-tf: Monade classes, en utilisant le type de familles
  • monadLib: Une collection de monade transformateurs.
  • mtl-tf: Monade transformateur de bibliothèque en utilisant le type de familles.
  • mmtl: Modulaire Monade transformateur de la bibliothèque
  • mtlx: Monade transformateur de la bibliothèque avec le type d'index, l'offre de "libre" copies.
  • composer-trans: Composable monade transformateurs

(et peut-être que j'ai raté quelques)

Lequel doit-on utiliser?

mtl est celui de la Plateforme Haskell, mais j'entends sur reddit que c'est pas cool.

Mais ce qui est mauvais sur le choix de toute façon, n'est-ce pas une bonne chose?

Eh bien, j'ai vu comment par exemple les auteurs de données-accesseur a dû faire toutes ces pour répondre à tout les choix populaires:

  • données accesseur-monadLib bibliothèque: fonctions d'Accesseur pour monadLib de monades
  • données accesseur-monades-fd bibliothèque: l'Utilisation de l'Accesseur pour accéder à l'état dans les monades-fd État de monade classe
  • données accesseur-monades-tf bibliothèque: l'Utilisation de l'Accesseur pour accéder à l'état dans les monades-tf État de monade type de famille
  • données accesseur-mtl bibliothèque: l'Utilisation de l'Accesseur pour accéder à l'état de mtl État de monade classe
  • données accesseur-transformateurs de la bibliothèque: l'Utilisation de l'Accesseur pour accéder à l'état dans les transformateurs État de monade

J'imagine que si ce qui se passe et, par exemple, plusieurs concurrents Flèche paquets évoluer, nous pourrions voir quelque chose comme: spoonklink-flèches-transformateurs, spoonklink-flèches-monadLib, spoonklink-tfArrows-transformateurs, spoonklink-tfArrows-monadLib, ...

Et puis j'ai peur que si spoonklink obtient fourchue, Hackage sera à court d'espace disque. :)

Questions:

  • Pourquoi sont-ils si nombreux monade transformateur de paquets?
  • Pourquoi est-mtl [considéré comme] cool?
  • Quelles sont les principales différences?
  • La plupart de ces apparemment en concurrence paquets ont été écrit par Andy Gill et sont maintenus par Ross Paterson. Est-ce à dire que ces paquets ne sont pas en concurrence, mais plutôt de travailler ensemble en quelque sorte? Et n'Andy et Ross considérer l'une de leurs propres paquets obsolètes?
  • On devrait vous et je utiliser?

65voto

C. A. McCann Points 56834

Un tas d'entre eux sont presque complètement équivalentes:

  • mtl utilise GHC extensions, mais transformers est Haskell 98.
  • monads-fd et monads-tf sont des add-ons pour transformers, à l'aide de dépendances fonctionnelles et le type de familles, respectivement, à la fois en offrant les fonctionnalités en mtl vous manque transformers.
  • mtl-tf est mtl ré-implémenté en utilisant le type de familles.

Donc, essentiellement, mtl == transformers ++ monads-fd, mtl-tf == transformers ++ monads-tf. L'amélioration de la portabilité et de la modularité de l' transformers et ses packages associés est pourquoi, mtl est pas cool ces jours, je pense.

mmtl et mtlx les deux semblent être similaires et/ou basées sur mtl, avec l'API des différences et des fonctionnalités supplémentaires.

MonadLib semble avoir une assez différent sur les choses, mais je ne suis pas familier avec elle directement. Aussi semble utiliser beaucoup de GHC extensions, plus que les autres.

En un coup d'œil compose-trans semble être plus comme la métaprogrammation trucs pour la création de monade transformateurs. Il prétend être compatible avec Control.Monad.Trans ... je suppose que signifie mtl?

En tout cas, je vous suggère la suite de la décision de l'algorithme:

  • Avez-vous besoin d'standard monades pour un nouveau projet? Utiliser transformers & co., nous aider à poser mtl pour se reposer.
  • Vous utilisez déjà mtl dans un projet de grande envergure? transformers n'est pas totalement compatible, mais personne ne va vous tuer pour ne pas passer.
  • Ne l'un de l'autre paquets fournissent inhabituelle fonctionnalité dont vous avez besoin? Peut aussi bien l'utiliser plutôt que de rouler votre propre.
  • Toujours insatisfait? Jeter toutes, téléchargez category-extras, et de résoudre tous les problèmes du monde avec une page et demi d' incompréhensible résumé non-sens à couper le générique de code.

20voto

Edward Kmett Points 18369

Pour le moment? Vous devriez probablement utiliser mtl. Ce qui se passe, c'est que l' transformers bibliothèque est pris en compte de l'MTL dans un mode qui monads-fd et monads-tf peuvent co-exister pacifiquement, mais à la dernière vérification qui n'était pas encore le cas.

Lorsque cela vous arrive, vous serez en mesure d'importer monads-fd et transformers et obtenir (presque) la même interface, à l'exception qu' State, etc. sera un alias pour StateT.

J'aimerais écrire à l' mtl, mais ne pas compter sur le fait que l'Etat, Lecteur, etc. sont actuellement en data qu'ils seront remplacés par types.

MonadLib est une autre alternative qui Iavor a été travailler sur, qui peut être utilisé en toute sécurité, car il ne partage pas tout les noms de module avec les autres, mais qui est assez différent du schéma d'utilisation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X