mtl, преобразователи, монады-fd, monadLib, и предпочтительный парадокс

Hackage имеет несколько пакетов для преобразователей монады:

  • mtl: библиотека преобразователя Монады
  • преобразователи: Конкретный функтор и преобразователи монады
  • монады-fd: классы Монады, с помощью функциональных зависимостей
  • монады-tf: классы Монады, с помощью семейств шрифтов
  • monadLib: набор преобразователей монады.
  • mtl-tf: библиотека преобразователя Монады с помощью семейств шрифтов.
  • mmtl: Модульная библиотека преобразователя Монады
  • mtlx: библиотека преобразователя Монады с индексами типа, предоставляя 'бесплатные' копии.
  • составлять-сделка: Компонуемые преобразователи монады

(и возможно я скучал по некоторым),

Какой мы будем использовать?

mtl является тем в Платформе Haskell, но я продолжаю слышать на reddit, что это некруто.

Но то, что плохо о выборе так или иначе, не является им просто хорошая вещь?

Ну, я видел, как, например, авторы средства доступа данных должны были сделать все ими для угождения просто популярному выбору:

  • библиотека data-accessor-monadLib: Средство доступа функционирует для монад monadLib
  • библиотека data-accessor-monads-fd: Используйте Средство доступа для доступа к состоянию в классе монады состояния монад-fd
  • библиотека data-accessor-monads-tf: Используйте Средство доступа для доступа к состоянию в семействе шрифтов монады состояния монад-tf
  • библиотека data-accessor-mtl: Используйте Средство доступа для доступа к состоянию в mtl классе монады состояния
  • библиотека преобразователей средства доступа данных: Используйте Средство доступа для доступа к состоянию в монаде состояния преобразователей

Я предполагаю, что, если это продолжается и например несколько конкурирующих пакетов Стрелки развиваются, мы могли бы видеть что-то как: spoonklink-arrows-transformers, spoonklink-arrows-monadLib, spoonklink-tfArrows-transformers, spoonklink-tfArrows-monadLib...

И затем я волнуюсь, что, если spoonklink разветвлен, в Hackage закончится дисковое пространство.:)

Вопросы:

  • Почему там столько пакетов преобразователя монады?
  • Почему mtl [считают] некрутым?
  • Каковы основные отличия?
  • Большинство этих по-видимому конкурирующих пакетов было записано Andy Gill и сохраняется Ross Paterson. Это означает, что эти пакеты не конкурируют, а скорее сотрудничают в некотором роде? И Andy и Ross рассматривают какой-либо из их собственных пакетов как устаревший?
  • Какой должен Вы, и я использую?

84
задан jeremy 3 January 2014 в 01:36
поделиться

2 ответа

Некоторые из них почти полностью эквивалентны:

  • mtl использует расширения GHC, но преобразователи - это Haskell 98.
  • monads-fd и monads-tf - это надстройки к преобразователям , использующие функциональные зависимости и семейства типов соответственно, обе из которых обеспечивают функциональность в mtl , который отсутствует в трансформаторах .
  • mtl-tf - это mtl , переопределенный с использованием семейств типов.

По сути, mtl == трансформаторы ++ monads-fd , mtl-tf == трансформаторы ++ монады-tf . Я думаю, что улучшенная переносимость и модульность трансформаторов и связанных с ними пакетов является причиной того, что mtl в наши дни не является крутым.

mmtl и mtlx кажутся похожими и / или основанными на mtl , с различиями API и дополнительными функциями.

MonadLib , кажется, имеет несколько иной подход к этому вопросу, но я не знаком с ним напрямую. Также, похоже, использует много расширений GHC, больше, чем другие.

На первый взгляд compose-trans больше похож на метапрограммирование для создания преобразователей монад. Он утверждает, что совместим с Control.Monad.Trans , что ... я полагаю, означает mtl ?

В любом случае, я бы предложил следующий алгоритм решения:

  • Вам нужны стандартные монады для нового проекта? Используйте трансформаторы и т. Д., Помогите нам уложить mtl в покой.
  • Вы уже используете mtl в большом проекте? трансформаторы не полностью совместимы, но никто не убьет вас за то, что вы не переключитесь.
  • Предоставляет ли один из других пакетов необычные функции, которые вам нужны? С таким же успехом можно использовать его, а не катать самостоятельно.
  • Все еще недовольны? Выбросьте их всех, загрузите дополнительные категории и решите все мировые проблемы с помощью полторы страницы непонятной абстрактной ерунды потрясающе универсального кода.
65
ответ дан 24 November 2019 в 08:38
поделиться

На данный момент? Вероятно, вам следует использовать mtl . Происходит то, что библиотека преобразователей выводится из MTL таким образом, что monads-fd и monads-tf могут мирно сосуществовать, но, наконец, проверьте, что этого еще не произошло.

Когда это произойдет, вы сможете импортировать monads-fd и преобразователи и получить (почти) тот же интерфейс, за исключением того, что State и т.д. будет псевдонимом для StateT .

Я бы написал mtl , но не полагался бы на тот факт, что State, Reader и т. Д. В настоящее время являются данными , поскольку они будут заменены на тип с.

MonadLib - еще одна альтернатива, над которой работал Iavor, которую можно безопасно использовать, поскольку она не разделяет имена модулей с другими, но имеет совершенно другой шаблон использования.

20
ответ дан 24 November 2019 в 08:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: