it-roy-ru.com

MTL, трансформаторы, монады-FD, MonadLib и парадокс выбора

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 для доступа к состоянию в семействе типов монад-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, ...

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

Вопросы:

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

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

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

По сути, 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 и решите все мировые проблемы с полторы страницы непонятная абстрактная ерунда потрясающе общий код.
65
C. A. McCann

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

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

Поэтому я хотел бы написать mtl, но не полагаться на тот факт, что State, Reader и т.д. В настоящее время data, поскольку они будут заменены на types.

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

20
Edward KMETT

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

12
duplode