mtl, transformatoren, monads-fd, monadLib und das paradox der wahl

91

Hackage hat mehrere Pakete für 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?
Yairchu
quelle
2
Dieser Link hat mir geholfen, mtl vs transformers haskell.org/haskellwiki/Monad_Transformer_Library
Brandon Cook
2
Scrolle nach unten für @ jberryman Kommentar ! Verwenden Sie MTL oder Transfomere, sie wurden kompatibel!
Sophie

Antworten:

70

Ein paar von ihnen sind fast völlig gleichwertig:

  • mtlverwendet GHC-Erweiterungen, ist aber transformersHaskell 98.
  • monads-fdund monads-tfsind Add-Ons zu transformers, die funktionale Abhängigkeiten bzw. Typfamilien verwenden und beide die Funktionalität bieten, die in mtlfehlt transformers.
  • mtl-tfwird mtlmithilfe von Typfamilien neu implementiert.

Also im Wesentlichen mtl== transformers++ monads-fd, mtl-tf== transformers++ monads-tf. Die verbesserte Portabilität und Modularität der transformerszugehörigen Pakete ist mtlmeiner Meinung nach heutzutage unkühl.

mmtlund mtlxbeide scheinen ähnlich zu sein und / oder darauf zu basieren mtl, mit API-Unterschieden und zusätzlichen Funktionen.

MonadLibscheint 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-transscheint es eher wie Metaprogrammierung für die Erstellung von Monadentransformatoren. Es behauptet, mit Control.Monad.Transwelchen kompatibel zu sein ... Ich denke, bedeutet mtl?

Auf jeden Fall würde ich folgenden Entscheidungsalgorithmus vorschlagen:

  • Benötigen Sie Standardmonaden für ein neues Projekt? Verwenden Sie transformers& Co., helfen Sie uns, uns mtlauszuruhen.
  • Verwenden Sie bereits mtlin einem großen Projekt? transformersist nicht vollständig kompatibel, aber niemand wird dich töten, weil du nicht gewechselt hast.
  • Bietet eines der anderen Pakete ungewöhnliche Funktionen, die Sie benötigen? Könnte es auch benutzen, anstatt dein eigenes zu rollen.
  • Immer noch unzufrieden? Wirf sie alle raus, lade sie herunter category-extrasund löse alle Probleme der Welt mit anderthalb Seiten unverständlichem abstraktem Unsinn, atemberaubend allgemeinem Code.
CA McCann
quelle
2
Wenn mtl == transformers ++ monads-fd, könnte es nicht einfach auf diese Weise implementiert werden? (als eine Phase zum Ersetzen), die die Notwendigkeit von Sachen wie Daten-Accessor-MTL
Yairchu
2
@yairchu: Nun ja, aber was erwartest du von mir? :) Die Aufrechterhaltung der Abwärtskompatibilität ist nie so einfach wie es scheint, und das Ändern von Schlüsselbibliotheken erfordert Zeit, Mühe und ein gewisses Maß an Community-Unterstützung. Die Situation mit Monadentransformatoren ist ein bekanntes Problem, aber ich denke nicht, dass es bei weitem die höchste Priorität von irgendjemandem ist.
CA McCann
5
@yairchu: das ist im Grunde das, was getan wird. Die nächste Hauptversion von mtl sollte ein Stub sein, der Transformatoren + monads-fd importiert, und die Kompatibilität mit dieser Version wird der entscheidende Faktor sein. Bibliotheken können dann individuell aktualisiert werden, sodass sie sowohl mit mtl 1.1 als auch mit mtl 1.1 kompatibel sind. Anschließend werden Apps in die Version eingeordnet, die installiert ist oder aufgrund ihrer restriktivsten Bibliotheksabhängigkeit erforderlich ist.
Edward KMETT
2
In der Mailingliste der Bibliotheken wird derzeit die Verlagerung von MonadIO (und möglicherweise von MonadTrans aus mtl in die Basis) erörtert. Es wurde jedoch nicht entschieden, ob MonadIO oder eine allgemeinere MonadBase extrahiert werden soll, obwohl "MonadBase" MPTCs, Fundeps usw. Benötigt .
Edward KMETT
27
Da fand ich diesen Beitrag äußerst informativ. Ich dachte, ich würde andere Googler aktualisieren: mtl hängt jetzt von Transformatoren ab, monads-fd ist jetzt ein Stub um mtl. Verwenden Sie also mtl, wenn Sie die zusätzlichen Extras benötigen, oder importieren Sie einfach Transformatoren, wenn es alles enthält, was Sie benötigen.
Jberryman
20

Für den Moment? Sie sollten wahrscheinlich verwenden mtl. Was geschieht , ist , dass die transformersBibliothek wird in einer Art und Weise der MTL herausgerechnet, dass monads-fdund monads-tfkoexistieren friedlich, aber in letzten Check , die noch nicht der Fall war.

In diesem Fall können Sie importieren monads-fdtransformers Sie (fast) dieselbe Schnittstelle und erhalten, mit der Ausnahme, dass Stateusw. ein Alias ​​für ist StateT.

Also würde ich schreiben mtl , mich aber nicht darauf verlassen, dass State, Reader usw. derzeit dataso sind, wie sie durch types 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.

Edward KMETT
quelle
4
In welchem ​​Sinne koexistieren? Wird es vom selben Paket verwendet? In dasselbe Modul importiert? Kombiniert in den gleichen Transformatorstapel? Das Mischen von Fundeps und TFs scheint mir im Allgemeinen eine schlechte Idee zu sein. Wie auch immer, ich habe transformers& co nicht ausgiebig genutzt . Es wurden jedoch keine anderen Probleme als einige geringfügige API-Unterschiede im Vergleich zum mtlUmschalten von (ziemlich einfachem) Code festgestellt.
CA McCann
4
Das Problem besteht darin, dass Sie nur ein Paket laden können, das ein bestimmtes Modul bereitstellt. Wenn Sie also eine Bibliothek verwenden, die auch intern mtl verwendet, können Sie keine Alternative importieren. Derzeit verwendet ein gesunder Prozentsatz der Hackage das MTL intern in irgendeiner Weise. Eine Reihe von Leuten bevorzugen die Verwendung von Typfamilien, und monads-tf gibt ihnen dies, aber denken Sie daran, dass im Moment, bis das Refactoring von transformers + monads-fd abgeschlossen ist, der Code von der Verwendung von Bibliotheken ausgeschlossen wird, die transitiv MTL benötigen . Das beinhaltet einige ziemlich große Ticketartikel.
Edward KMETT
1
Die Verwendung von Transformatoren + Monaden- (tf | fd) wird diese Essiggurke langfristig vermeiden, aber wir sind noch nicht da. In der Zwischenzeit ist das Überwiegen der Nutzung zugunsten von mtl. Der Upgrade-Pfad sieht so aus, dass die nächste Hauptversion des MTL als Stub neu definiert wird, der Monaden-FD und Transformatoren importiert. Die Hauptversionsunterbrechung bietet eine gute Möglichkeit, in Ihrer Kabalendatei anzugeben, dass es Ihnen egal ist, welche Version Sie erhalten (dh es ist Ihnen egal, ob State ein Typalias oder ein Datentyp ist), und sobald diese Hauptversionsstörung auftritt, ist dies der Fall Es ist Ihnen egal, ob jede Bibliothek, die Sie verwenden, dieselben Vorurteile aufweist.
Edward KMETT
1
Letztendlich ist Ihre bisherige Erfahrung genau das, was Transformatoren / Monaden- (tf | fd) unterstützen sollen. Was jedoch nach dem Schreiben erkannt wurde, war, dass die Community ziemlich schlecht darin ist, Bibliotheken zu wechseln, wenn es keinen zwingenden Grund zum Springen und eine Menge alter Gründe zum Bleiben gibt. Daher muss mtl neu definiert und der Upgrade-Pfad klargestellt werden.
Edward KMETT
Super, danke für die ausführliche Klarstellung! Offensichtlich hatte der Code, den ich wechselte, nur wenige externe Abhängigkeiten - hauptsächlich FFI-Bindungen, denke ich. Ich wusste auch nicht, dass Modulnamenkonflikte so ... invasiv sind, denke ich? Das macht die Dinge in der Tat unangenehm. :(
CA McCann
15

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.

Duplode
quelle