MTL, трансформаторы, монады-FD, MonadLib и парадокс выбора - PullRequest
84 голосов
/ 05 мая 2010

Hackage имеет несколько пакетов для монадных трансформаторов:

  • MTL : библиотека монадных трансформаторов
  • трансформаторы : Конкретные трансформаторы с функтором и монадой
  • monads-fd : классы монад с использованием функциональных зависимостей
  • monads-tf : классы монад, использующие семейства типов
  • monadLib : Коллекция монадных трансформаторов.
  • mtl-tf : библиотека монадных преобразователей, использующая семейства типов.
  • mmtl : библиотека модульных трансформаторов Monad
  • mtlx : библиотека преобразователей Monad с индексами типов, предоставляющая «бесплатные» копии.
  • compose-trans : составные монадные трансформаторы

(а может я и пропустил)

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

MTL является платформой на платформе Haskell, но я по-прежнему слышу на Reddit, что она не крутая.

Но что плохого в выборе в любом случае, разве это не просто хорошо?

Ну, я видел, как, например, авторам средства доступа к данным пришлось сделать все это, чтобы удовлетворить только популярный выбор:

  • библиотека data-accessor-monadLib: функции доступа для монад monadLib
  • библиотека data-accessor-monads-fd: использование Accessor для доступа к состоянию в классе монад-fd State monad
  • библиотека data-accessor-monads-tf: используйте Accessor для доступа к состоянию в monads-tf State Тип монады
  • библиотека data-accessor-mtl: использование Accessor для доступа к состоянию в классе монад mtl State
  • библиотека data-accessor-transformers: использование Accessor для доступа к состоянию в преобразователях Монада состояний

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

А потом я переживаю, что если ложклинк будет разветвлен, у Хакеджа не хватит места на диске. :)

Вопросы:

* * 1068 Почему так много монадных трансформаторных пакетов? Почему mtl [считается] не круто? В чем основные отличия? Большинство этих, казалось бы, конкурирующих пакетов были написаны Энди Гиллом и поддерживаются Россом Патерсоном. Означает ли это, что эти пакеты не конкурируют, а скорее работают вместе? А Энди и Росс считают какие-то свои пакеты устаревшими? Какой из них вы и я должны использовать?

Ответы [ 3 ]

65 голосов
/ 05 мая 2010

Куча из них почти полностью эквивалентна:

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

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

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

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

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

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

  • Вам нужны стандартные монады для нового проекта? Используйте transformers & co., Помогите нам положить mtl на отдых.
  • Вы уже используете mtl в большом проекте? transformers не полностью совместимо, но никто не убьет вас за то, что вы не переключились.
  • Предоставляет ли один из других пакетов необычную функциональность, которая вам нужна? Можете использовать его вместо того, чтобы кататься самостоятельно.
  • Все еще не удовлетворены? Выкиньте их все, скачайте category-extras и решите все мировые проблемы с полторы страницы непонятного абстрактного вздора потрясающе общего кода.
20 голосов
/ 05 мая 2010

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

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

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

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

12 голосов
/ 05 марта 2017

Факторинг, который Эдвард Кметт упоминает в его ответ , был завершен в конце 2010 года. Его конечным результатом было monads-fd , построенное на трансформаторах , ставшее версией 2 из MTL . Как следствие повсеместного распространения mtl , monads-tf никогда не завоевывало популярность. По состоянию на начало 2017 года преобразователи mtl и являются единственными библиотеками монадных преобразователей, которые широко используются.

...