В Hackage есть несколько пакетов для преобразователей монад:
- mtl : библиотека преобразователей монад
- трансформаторы : Конкретный функтор и монадные трансформаторы
- monads-fd : классы монад, использующие функциональные зависимости
- monads-tf : классы монад, использующие семейства типов
- monadLib : Коллекция преобразователей монад.
- mtl-tf : библиотека преобразователей монад, использующая семейства типов.
- mmtl : Модульная библиотека преобразователей Monad
- mtlx : библиотека преобразователей монад с указателями типов, предоставляющая «бесплатные» копии.
- compose-trans : Составные преобразователи монад
(а может я что-то пропустил)
Какой из них использовать?
mtl - это тот, что есть на платформе Haskell, но я постоянно слышу на Reddit, что это не круто.
Но что в любом случае плохого в выборе, разве это не хорошо?
Что ж, я видел, как, например, авторам средства доступа к данным пришлось сделать все это, чтобы удовлетворить только популярные варианты:
- библиотека data-accessor-monadLib: функции доступа для монад monadLib
- Библиотека data-accessor-monads-fd: используйте Accessor для доступа к состоянию в monads-fd Класс монады состояния
- Библиотека data-accessor-monads-tf: используйте Accessor для доступа к состоянию в monads-tf Семейство типов монад состояний
- библиотека data-accessor-mtl: используйте Accessor для доступа к состоянию в классе монады состояния mtl
- библиотека data-accessor-transformers: используйте Accessor для доступа к состоянию в преобразователях State monad
Я предполагаю, что если это будет продолжаться и, например, появятся несколько конкурирующих пакетов Arrow, мы можем увидеть что-то вроде: Spoklink-стрелки-трансформеры, Spoklink-стрелки-monadLib, Spoklink-tfArrows-transformers, Spokeklink-tfArrows-monadLib, ...
И потом я беспокоюсь, что если ложка будет разветвлена, у Hackage закончится место на диске. :)
Вопросы:
- Почему так много пакетов трансформаторов монад?
- Почему mtl [считается] не крутым?
- В чем основные отличия?
- Большинство этих, казалось бы, конкурирующих пакетов были написаны Энди Гиллом и поддерживаются Россом Патерсоном. Означает ли это, что эти пакеты не конкурируют, а скорее работают вместе? И считают ли Энди и Росс какие-либо из своих пакетов устаревшими?
- Какой из них следует использовать нам с вами?
Ответы:
Некоторые из них почти полностью эквивалентны:
mtl
использует расширения GHC, ноtransformers
это Haskell 98.monads-fd
иmonads-tf
являются надстройкамиtransformers
, использующими функциональные зависимости и семейства типов, соответственно, и обеспечивают функцииmtl
, отсутствующие вtransformers
.mtl-tf
являетсяmtl
переписана с использованием семей типа.По сути,
mtl
==transformers
++monads-fd
,mtl-tf
==transformers
++monads-tf
. Я думаю, что улучшенная переносимость, модульностьtransformers
и связанные с ним пакеты - вот почемуmtl
в наши дни это не круто.mmtl
иmtlx
оба кажутся похожими и / или основанными наmtl
различиях API и дополнительных функциях.MonadLib
кажется, у меня совсем другой взгляд на вещи, но я не знаком с этим напрямую. Также, похоже, использует много расширений GHC, больше, чем другие.На первый взгляд
compose-trans
это больше похоже на метапрограммирование для создания преобразователей монад. Он утверждает, что совместим сControl.Monad.Trans
какими ... я думаю, значитmtl
?Во всяком случае, я бы предложил следующий алгоритм решения:
transformers
& co., Помогите намmtl
упокоиться.mtl
в большом проекте?transformers
не полностью совместим, но никто не убьет вас за то, что вы не переключитесь.category-extras
и решите все мировые проблемы с помощью полутора страницнепонятного абстрактного бредапотрясающе универсального кода.источник
На момент? Вам, вероятно, следует использовать
mtl
. То , что происходит в том , чтоtransformers
библиотека быть вынесена из MTL в моде , чтоmonads-fd
иmonads-tf
может мирно сосуществовать, но в последней проверки , который не был еще случай.Когда это произойдет, вы сможете импортировать
monads-fd
иtransformers
получить (почти) тот же интерфейс, за исключением тогоState
, что и т.д. будет псевдонимом дляStateT
.Поэтому я бы написал
mtl
, но не полагался бы на тот факт, что State, Reader и т. Д. В настоящее времяdata
заменены наtype
s.MonadLib
- это еще одна альтернатива, над которой работает Iavor, которую можно безопасно использовать, поскольку она не разделяет имена модулей с другими, но имеет совершенно другой шаблон использования.источник
transformers
& co. еще, но не заметил никаких проблем, кроме некоторых незначительных отличий API отmtl
при переключении некоторого (довольно простого) кода.Вычленение на множители, о котором Эдвард Кметт упоминает в своем ответе, было завершено в конце 2010 года. Его конечным результатом стал monads-fd , построенный на трансформаторах , ставший версией 2 mtl . Вследствие повсеместного распространения mtl , monads -tf так и не прижился. По состоянию на начало 2017 года mtl и трансформаторы - единственные библиотеки преобразователей монад, которые получили широкое распространение.
источник