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 и трансформаторы являются единственными библиотеками трансформаторов монады, которые широко используются.