Mtl, трансформаторы, monads-fd, monadLib и парадокс выбора
Hackage имеет несколько пакетов для монодальных трансформаторов:
- mtl: библиотека трансформатора Монады
- transformers: Конкретные функторные и монадные трансформаторы
- monads-fd: классы Monad, используя функциональные зависимости
- monads-tf: классы Monad, используя семейства типов
- monadLib: коллекция монадных трансформаторов.
- mtl-tf: библиотека трансформаторов Monad с использованием семейств типов.
- mmtl: Модульная библиотека трансформатора Monad.
- mtlx: библиотека трансформаторов Monad с индексами типов, предоставляющая "свободные" копии.
- compose-trans: Композитные монадные трансформаторы
(и, возможно, я пропустил некоторые)
Какой из них мы будем использовать?
mtl - это тот, что есть в платформе Haskell, но я продолжаю слышать по reddit, что он нераскрывается.
Но что плохого в выборе в любом случае, разве это не просто хорошая вещь?
Хорошо, я видел, как, например, авторы доступа к данным должны были сделать все это, чтобы удовлетворить только популярные варианты:
- библиотека data-accessor-monadLib: функции Accessor для monads monadLib
- библиотека data-accessor-monads-fd: используйте Accessor для доступа к состоянию в monad-fd State monad class
- data-accessor-monads-tf library: использовать Accessor для доступа к состоянию в monads-tf. Семейство состояний типа monad.
- библиотека data-accessor-mtl: используйте Accessor для доступа к состоянию в mtl State monad class
- библиотека данных-адаптеров-преобразователей: используйте Accessor для доступа к состоянию в трансформаторах State monad
Я предполагаю, что если это произойдет, и, например, несколько конкурирующих пакетов Arrow будут развиваться, мы увидим что-то вроде: spoonklink-стрелки-трансформаторы, spoonklink-стрелки-monadLib, spoonklink-tfArrows-transformers, spoonklink-tfArrows-monadLib,...
И потом я беспокоюсь, что если spoonklink будет раздвоен, у Hackage закончится дисковое пространство.:)
Вопросы:
- Почему так много пакетов трансформаторов монады?
- Почему mtl [считается] uncool?
- Каковы основные отличия?
- Большинство из этих, казалось бы, конкурирующих пакетов были написаны Энди Джилл и поддерживаются Росс Патерсон. Означает ли это, что эти пакеты не конкурируют, а работают в некотором роде? И Энди и Росс считают, что любой из их собственных пакетов устарел?
- Какую из них вам и вам использовать?
Ответы
Ответ 1
Букет из них почти полностью эквивалентен:
-
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
и разрешите все мировые проблемы со страницей с половиной непонятной абстрактной ерундызабастовкa > захватывающий общий код.
Ответ 2
На данный момент? Вероятно, вы должны использовать mtl
. Что происходит, так это то, что библиотека transformers
выставляется из MTL таким образом, что monads-fd
и monads-tf
могут сосуществовать мирно, но, наконец, проверить, что это еще не так.
Когда это произойдет, вы сможете импортировать monads-fd
и transformers
и получить (почти) тот же интерфейс, за исключением того, что State
и т.д. будет псевдонимом для StateT
.
Поэтому я пишу в mtl
, но не полагаюсь на то, что State, Reader и т.д. в настоящее время data
, поскольку они будут заменены на type
s.
MonadLib
- это еще одна альтернатива, над которой работает Iavor, которую можно безопасно использовать, поскольку она не использует имена модулей с другими, но имеет довольно различный шаблон использования.
Ответ 3
В конце 2010 года был завершен факторинг Эдварда Кемта в его ответе. Его конечным результатом стал monads-fd, построенный на трансформаторах, став второй версией mtl. Как следствие вездесущности mtl, monads-tf никогда не попадался. На начало 2017 года mtl и трансформаторы являются единственными библиотеками трансформаторов монады, которые широко используются.