Hackage ma kilka pakietów dla transformatorów monad:
- mtl : Biblioteka transformatorów Monad
- transformatory : funktor do betonu i transformatory monadowe
- monads-fd : Klasy Monad, używające zależności funkcjonalnych
- monads-tf : Klasy Monad, używające rodzin typów
- monadLib : kolekcja transformatorów monad.
- mtl-tf : biblioteka transformatorów Monad korzystająca z rodzin typów.
- mmtl : Modularna biblioteka transformatorów Monad
- mtlx : Biblioteka transformatora Monad z indeksami typów, zapewniająca „darmowe” kopie.
- compose-trans : Komponowalne transformatory monadowe
(a może trochę przegapiłem)
Którego użyjemy?
mtl jest tym na platformie Haskell, ale ciągle słyszę na reddicie, że jest niefajny.
Ale co jest złego w wyborze, czy nie jest to po prostu dobra rzecz?
Cóż, widziałem, jak na przykład autorzy akcesorów danych musieli zrobić to wszystko, aby zaspokoić tylko popularne wybory:
- biblioteka danych-accessor-monadLib: Funkcje pomocnicze dla monad monadLib
- data-accessor-monads-fd library: Użyj Accessor, aby uzyskać dostęp do stanu w klasie monads-fd State monad
- data-accessor-monads-tf library: Użyj Accessor, aby uzyskać dostęp do stanu w rodzinie typów monad-tf State monad
- data-accessor-mtl biblioteka: Użyj Accessor, aby uzyskać dostęp do stanu w klasie monad stanu mtl
- biblioteka transformersów dostępu do danych: Użyj Accessor, aby uzyskać dostęp do stanu w monadzie stanu transformatorów
Wyobrażam sobie, że jeśli tak się stanie i na przykład kilka konkurencyjnych pakietów Arrow ewoluuje, możemy zobaczyć coś takiego: spoonklink-arrows-transformers, spoonklink-arrows-monadLib, spoonklink-tfArrows-transformers, spoonklink-tfArrows-monadLib, ...
A potem martwię się, że jeśli Spoonklink zostanie rozwidlony, Hackage zabraknie miejsca na dysku. :)
Pytania:
- Dlaczego jest tak wiele pakietów transformatorów Monad?
- Dlaczego mtl [uważa się] za niefajne?
- Jakie są kluczowe różnice?
- Większość z tych pozornie konkurujących ze sobą pakietów została napisana przez Andy'ego Gilla i jest zarządzana przez Rossa Patersona. Czy to oznacza, że te pakiety nie konkurują ze sobą, ale w jakiś sposób ze sobą współpracują? I czy Andy i Ross uważają któryś z ich własnych pakietów za przestarzały?
- Którego powinieneś użyć?
haskell
monads
monad-transformers
yairchu
źródło
źródło
Odpowiedzi:
Kilka z nich jest prawie całkowicie równoważnych:
mtl
używa rozszerzeń GHC, aletransformers
jest Haskell 98.monads-fd
imonads-tf
są dodatkamitransformers
, używającymi odpowiednio zależności funkcjonalnych i rodzin typów, zapewniających funkcjonalność,mtl
której brakujetransformers
.mtl-tf
jestmtl
ponownie zaimplementowany przy użyciu rodzin typów.Więc zasadniczo
mtl
==transformers
++monads-fd
,mtl-tf
==transformers
++monads-tf
. Wydaje mi się, że ulepszona przenośność i modułowośćtransformers
pakietów oraz powiązanych z nimi pakietów jestmtl
obecnie niefajna.mmtl
imtlx
oba wydają się być podobne i / lub oparte namtl
różnicach API i dodatkowych funkcjach.MonadLib
wydaje się mieć nieco inne podejście do spraw, ale nie znam tego bezpośrednio. Wydaje się również, że używa wielu rozszerzeń GHC, więcej niż inne.Na pierwszy rzut oka
compose-trans
wydaje się, że bardziej przypomina metaprogramowanie do tworzenia transformatorów monadowych. Twierdzi, że jest kompatybilny zControl.Monad.Trans
którym ... chyba oznaczamtl
?W każdym razie sugerowałbym następujący algorytm decyzyjny:
transformers
& co., Pomóż nammtl
odpocząć.mtl
w dużym projekcie?transformers
nie jest w pełni kompatybilny, ale nikt cię nie zabije za brak przełączenia.category-extras
i rozwiąż wszystkie problemy świata za pomocą półtorej stronyniezrozumiałego abstrakcyjnego nonsensu,zapierającego dech w piersiach kodu ogólnego.źródło
Na chwilę? Powinieneś prawdopodobnie użyć
mtl
. Dzieje się tak, żetransformers
biblioteka jest wyodrębniana z MTL w sposób, którymonads-fd
imonads-tf
może współistnieć pokojowo, ale w końcu to jeszcze nie było.Kiedy tak się stanie, będziesz mógł zaimportować
monads-fd
itransformers
uzyskać (prawie) ten sam interfejs, z wyjątkiem tegoState
, że itp. Będzie aliasem dlaStateT
.Piszę więc
mtl
, ale nie będę polegał na tym, że State, Reader itp. Są obecniedata
tak, jak zostaną zastąpione przeztype
s.MonadLib
to kolejna alternatywa, nad którą pracował Iavor, z której można bezpiecznie korzystać, ponieważ nie ma wspólnych nazw modułów z innymi, ale ma dość inny wzorzec użycia.źródło
transformers
& co. jeszcze, ale nie zauważyłem żadnych problemów innych niż drobne różnice w API w porównaniu zmtl
przełączaniem jakiegoś (dość prostego) kodu.Rozliczenie, o którym wspomina Edward Kmett w swojej odpowiedzi, zostało zakończone pod koniec 2010 roku. Efektem końcowym były monady-fd , zbudowane na transformatorach , stające się wersją 2 mtl . W konsekwencji wszechobecności MTL , monady-tf nigdy się nie przyjęły. Od początku 2017 r. Mtl i transformers są jedynymi bibliotekami transformatorów monad, które są szeroko stosowane.
źródło