Hackage hat mehrere Pakete für Monadentransformatoren:
- mtl : Monadentransformatorbibliothek
- Transformatoren : Betonfunktor- und Monadentransformatoren
- monads-fd : Monadenklassen unter Verwendung funktionaler Abhängigkeiten
- monads-tf : Monadenklassen unter Verwendung von Typfamilien
- monadLib : Eine Sammlung von Monadentransformatoren.
- mtl-tf : Monadentransformatorbibliothek unter Verwendung von Typfamilien.
- mmtl : Modulare Monadentransformatorbibliothek
- mtlx : Monadentransformatorbibliothek mit Typindizes , die 'kostenlose' Kopien bereitstellt.
- compose-trans : Zusammensetzbare Monadentransformatoren
(und vielleicht habe ich welche verpasst)
Welches sollen wir verwenden?
mtl ist das auf der Haskell-Plattform, aber ich höre immer wieder auf reddit, dass es uncool ist.
Aber was ist überhaupt schlecht an der Wahl, ist es nicht nur eine gute Sache?
Nun, ich habe gesehen, wie zum Beispiel die Autoren von Data-Accessor all dies treffen mussten, um nur die populären Entscheidungen zu treffen:
- data-accessor-monadLib-Bibliothek: Accessor-Funktionen für die Monaden von monadLib
- data-accessor-monads-fd-Bibliothek: Verwenden Sie Accessor, um auf den Status in der Monadenklasse monads-fd State zuzugreifen
- data-accessor-monads-tf-Bibliothek: Verwenden Sie Accessor, um auf den Status in der Monadentypfamilie monads-tf State zuzugreifen
- data-accessor-mtl library: Verwenden Sie Accessor, um auf den Status in der mtl State-Monadenklasse zuzugreifen
- Datenzugriffs-Transformator-Bibliothek: Verwenden Sie Accessor, um auf den Status in der Statusmonade des Transformators zuzugreifen
Ich stelle mir vor, dass, wenn dies so weitergeht und sich zum Beispiel mehrere konkurrierende Arrow-Pakete entwickeln, wir etwas sehen könnten wie: Spoonklink-Pfeile-Transformatoren, Spoonklink-Pfeile-monadLib, Spoonklink-tfArrows-Transformatoren, Spoonklink-tfArrows-monadLib, ...
Und dann mache ich mir Sorgen, dass Hackage keinen Speicherplatz mehr hat, wenn der Spoonklink gespalten wird. :) :)
Fragen:
- Warum gibt es so viele Monadentransformator-Pakete?
- Warum ist mtl uncool?
- Was sind die Hauptunterschiede?
- Die meisten dieser scheinbar konkurrierenden Pakete wurden von Andy Gill geschrieben und werden von Ross Paterson gepflegt. Bedeutet dies, dass diese Pakete nicht miteinander konkurrieren, sondern auf irgendeine Weise zusammenarbeiten? Und halten Andy und Ross eines ihrer eigenen Pakete für veraltet?
- Welches sollten Sie und ich verwenden?
quelle
Antworten:
Ein paar von ihnen sind fast völlig gleichwertig:
mtl
verwendet GHC-Erweiterungen, ist abertransformers
Haskell 98.monads-fd
undmonads-tf
sind Add-Ons zutransformers
, die funktionale Abhängigkeiten bzw. Typfamilien verwenden und beide die Funktionalität bieten, die inmtl
fehlttransformers
.mtl-tf
wirdmtl
mithilfe von Typfamilien neu implementiert.Also im Wesentlichen
mtl
==transformers
++monads-fd
,mtl-tf
==transformers
++monads-tf
. Die verbesserte Portabilität und Modularität dertransformers
zugehörigen Pakete istmtl
meiner Meinung nach heutzutage unkühl.mmtl
undmtlx
beide scheinen ähnlich zu sein und / oder darauf zu basierenmtl
, mit API-Unterschieden und zusätzlichen Funktionen.MonadLib
scheint die Dinge etwas anders zu sehen, aber ich bin nicht direkt damit vertraut. Scheint auch viele GHC-Erweiterungen zu verwenden, mehr als die anderen.Auf den ersten Blick
compose-trans
scheint es eher wie Metaprogrammierung für die Erstellung von Monadentransformatoren. Es behauptet, mitControl.Monad.Trans
welchen kompatibel zu sein ... Ich denke, bedeutetmtl
?Auf jeden Fall würde ich folgenden Entscheidungsalgorithmus vorschlagen:
transformers
& Co., helfen Sie uns, unsmtl
auszuruhen.mtl
in einem großen Projekt?transformers
ist nicht vollständig kompatibel, aber niemand wird dich töten, weil du nicht gewechselt hast.category-extras
und löse alle Probleme der Welt mit anderthalb Seitenunverständlichem abstraktem Unsinn,atemberaubend allgemeinem Code.quelle
Für den Moment? Sie sollten wahrscheinlich verwenden
mtl
. Was geschieht , ist , dass dietransformers
Bibliothek wird in einer Art und Weise der MTL herausgerechnet, dassmonads-fd
undmonads-tf
koexistieren friedlich, aber in letzten Check , die noch nicht der Fall war.In diesem Fall können Sie importieren
monads-fd
transformers
Sie (fast) dieselbe Schnittstelle und erhalten, mit der Ausnahme, dassState
usw. ein Alias für istStateT
.Also würde ich schreiben
mtl
, mich aber nicht darauf verlassen, dass State, Reader usw. derzeitdata
so sind, wie sie durchtype
s ersetzt werden.MonadLib
ist eine weitere Alternative, an der Iavor gearbeitet hat, die sicher verwendet werden kann, da sie keine Modulnamen mit den anderen teilt, aber ein ziemlich anderes Verwendungsmuster aufweist.quelle
transformers
& co nicht ausgiebig genutzt . Es wurden jedoch keine anderen Probleme als einige geringfügige API-Unterschiede im Vergleich zummtl
Umschalten von (ziemlich einfachem) Code festgestellt.Das Ausklammern der Erwähnungen von Edward Kmett in seiner Antwort wurde Ende 2010 abgeschlossen. Das Endergebnis war monads-fd , das auf Transformatoren aufgebaut war und Version 2 von mtl wurde . Infolge der Allgegenwart von mtl haben sich Monaden-tf nie wirklich durchgesetzt. Seit Anfang 2017 sind MTL und Transformatoren die einzigen Monadentransformator-Bibliotheken, die weit verbreitet sind.
quelle