Hackage memiliki beberapa paket untuk trafo monad:
- mtl : Perpustakaan trafo Monad
- Transformer : Trafo functor dan monad beton
- monads-fd : Kelas monad , menggunakan dependensi fungsional
- monads-tf : Kelas Monad, menggunakan keluarga tipe
- monadLib : Kumpulan transformator monad.
- mtl-tf : Pustaka transformator monad menggunakan keluarga tipe.
- mmtl : Perpustakaan transformator Monad Modular
- mtlx : Pustaka transformator Monad dengan indeks tipe, menyediakan salinan 'gratis'.
- compose-trans : Transformator monad yang dapat disusun
(dan mungkin saya melewatkan beberapa)
Yang mana yang akan kami gunakan?
mtl adalah salah satu yang ada di Platform Haskell, tetapi saya terus mendengar di reddit bahwa ini tidak keren.
Tapi apa buruknya pilihan, bukankah itu hanya hal yang baik?
Nah, saya melihat bagaimana misalnya penulis pengakses data harus membuat semua ini untuk memenuhi hanya pilihan yang populer:
- pustaka data-accessor-monadLib: Fungsi pengakses untuk monad monadLib
- pustaka data-accessor-monads-fd: Gunakan Accessor untuk mengakses status di kelas monad Status monads-fd
- pustaka data-accessor-monads-tf: Gunakan Accessor untuk mengakses status di monads-tf State monad type family
- pustaka data-accessor-mtl: Gunakan Accessor untuk mengakses status di kelas monad mtl State
- pustaka data-accessor-transformers: Gunakan Accessor untuk mengakses status di monad State transformer
Saya membayangkan bahwa jika ini terus berjalan dan misalnya beberapa paket Arrow yang bersaing berkembang, kita mungkin melihat sesuatu seperti: spoonklink-arrows-transformers, spoonklink-arrows-monadLib, spoonklink-tfArrows-transformers, spoonklink-tfArrows-monadLib, ...
Dan kemudian saya khawatir jika spoonklink bercabang, Hackage akan kehabisan ruang disk. :)
Pertanyaan:
- Kenapa banyak sekali paket trafo monad?
- Mengapa mtl [dianggap] tidak keren?
- Apa perbedaan utamanya?
- Kebanyakan dari paket yang tampaknya bersaing ini ditulis oleh Andy Gill dan dikelola oleh Ross Paterson. Apakah ini berarti bahwa paket-paket ini tidak bersaing tetapi bekerja bersama dalam beberapa hal? Dan apakah Andy dan Ross menganggap paket mereka sendiri sudah usang?
- Manakah yang harus Anda dan saya gunakan?
sumber
Jawaban:
Beberapa dari mereka hampir sepenuhnya setara:
mtl
menggunakan ekstensi GHC, tetapitransformers
Haskell 98.monads-fd
danmonads-tf
merupakan pengayatransformers
, masing-masing menggunakan dependensi fungsional dan kelompok tipe, keduanya menyediakan fungsionalitasmtl
yang hilang daritransformers
.mtl-tf
adalahmtl
reimplemented menggunakan keluarga jenis.Jadi intinya,
mtl
==transformers
++monads-fd
,mtl-tf
==transformers
++monads-tf
. Portabilitas dan modularitas yang ditingkatkan sertatransformers
paket-paket terkaitnya adalah mengapamtl
tidak keren belakangan ini, menurut saya.mmtl
danmtlx
keduanya tampak mirip dan / atau berdasarkanmtl
, dengan perbedaan API dan fitur tambahan.MonadLib
tampaknya memiliki pandangan yang agak berbeda tentang masalah, tetapi saya tidak terbiasa dengannya secara langsung. Juga tampaknya menggunakan banyak ekstensi GHC, lebih dari yang lain.Sekilas
compose-trans
sepertinya metaprogramming lebih seperti hal untuk membuat trafo monad. Ini diklaim kompatibel denganControl.Monad.Trans
yang ... Kurasa maksudnyamtl
?Bagaimanapun, saya menyarankan algoritma keputusan berikut:
transformers
& co., Bantu kami berbaringmtl
untuk beristirahat.mtl
dalam proyek besar?transformers
tidak sepenuhnya kompatibel, tetapi tidak ada yang akan membunuh Anda karena tidak beralih.category-extras
, dan selesaikan semua masalah dunia dengan satu setengah halaman kode generikabstrak yang tidak masuk akal dan tidak masuk akal.sumber
Untuk saat ini? Anda mungkin harus menggunakan
mtl
. Apa yang terjadi adalah bahwatransformers
perpustakaan sedang difaktorkan keluar dari MTL dengan cara yangmonads-fd
danmonads-tf
dapat hidup berdampingan dengan damai, tetapi pada akhirnya pemeriksaan itu belum terjadi.Ketika itu terjadi, Anda akan dapat mengimpor
monads-fd
dantransformers
mendapatkan (hampir) antarmuka yang sama, dengan pengecualian bahwaState
, dll. Akan menjadi alias untukStateT
.Jadi saya akan menulis ke
mtl
, tapi tidak bergantung pada fakta bahwa State, Reader, dll saat inidata
akan diganti dengantype
s.MonadLib
adalah alternatif lain yang sedang dikerjakan Iavor, yang dapat digunakan dengan aman karena tidak berbagi nama modul dengan yang lain, tetapi memiliki pola penggunaan yang cukup berbeda.sumber
transformers
& co. namun tidak melihat masalah apa pun selain beberapa perbedaan kecil API vs.mtl
saat mengalihkan beberapa kode (cukup sederhana).Pemfaktoran yang disebutkan Edward Kmett dalam jawabannya selesai pada akhir 2010. Hasil akhirnya adalah monads-fd , dibangun di atas trafo , menjadi versi 2 dari mtl . Sebagai konsekuensi dari mtl yang ada di mana-mana , monads-tf tidak pernah benar-benar populer. Pada awal 2017, mtl dan transformer adalah satu-satunya library trafo monad yang digunakan secara luas.
sumber