mtl, трансформаторы, monads-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 для доступа к состоянию в monads-tf Семейство типов монад состояний
  • библиотека data-accessor-mtl: используйте Accessor для доступа к состоянию в классе монады состояния mtl
  • библиотека data-accessor-transformers: используйте Accessor для доступа к состоянию в преобразователях State monad

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

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

Вопросов:

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

person yairchu    schedule 04.05.2010    source источник
comment
Эта ссылка помогла мне понять, что такое MTL и трансформеры haskell.org/haskellwiki/Monad_Transformer_Library   -  person Brandon Cook    schedule 14.07.2014
comment
Прокрутите вниз, чтобы увидеть комментарий @jberryman ! Используйте мтл или трансформеры, они стали совместимы!   -  person Sophie    schedule 27.03.2017


Ответы (3)


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

  • 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 и решите все мировые проблемы с помощью страницы и половина непонятной абстрактной чепухи потрясающе универсального кода.
person C. A. McCann    schedule 04.05.2010
comment
если mtl == transformers ++ monads-fd, разве это не может быть реализовано таким образом? (как этап его замены), который избавит от необходимости иметь такие вещи, как data-accessor-mtl - person yairchu; 05.05.2010
comment
@yairchu: Однако они не совместимы на 100% - я думаю, что в API есть небольшие отличия. Для большинства пакетов, использующих mtl, переключение не составит труда, но, вероятно, это не то, что можно безопасно сделать автоматически или за кулисами. - person C. A. McCann; 05.05.2010
comment
@camccann: Понятно. Но все же есть некоторая унификация, которую можно было бы сделать обратно совместимым способом, извлекая некоторые общие вещи. Точно такой же класс MonadTrans можно поместить в отдельный пакет. Тогда отпадет необходимость в сплитах вроде MaybeT / MaybeT-трансформеров. Другой - монада Identify, которая даже воссоздается в TypeCompose, потому что Conal не хочет зависеть от mtl. - person yairchu; 06.05.2010
comment
@yairchu: Ну да, но что ты думаешь, что я буду делать? :) Поддержание обратной совместимости никогда не бывает таким простым, как кажется, а изменение ключевых библиотек требует времени, усилий и некоторой степени поддержки сообщества. Ситуация с преобразователем монад - известная проблема, но я не думаю, что это чья-то первоочередная задача. - person C. A. McCann; 06.05.2010
comment
@yairchu: вот что в основном и делается. следующая основная версия mtl должна быть заглушкой, которая импортирует трансформаторы + monads-fd, и совместимость с этой версией будет решающим фактором. После этого библиотеки смогут обновляться по отдельности, чтобы они были совместимы как с mtl 1.1, так и с 1.2, а затем приложения будут привязаны к той версии, которая установлена ​​или требуется их наиболее жесткой зависимостью от библиотеки. - person Edward KMETT; 06.05.2010
comment
@camccann: Просто пытаюсь обсудить, какое направление было бы хорошим для библиотеки, я не жду, чтобы вы его реализовали. Хотя, я никогда не видела тебя и супермена на этом месте ... :) - person yairchu; 06.05.2010
comment
@camccann: Re Поддерживать обратную совместимость никогда не так просто, как кажется. Заставить mtl взять тот же самый класс MonadTrans, который он имеет, из другого пакета (у которого нет конфликтов модулей с ним) является обратно совместимым. Вы предполагаете, что это не так просто, т.е. что это не работает. Как так? - person yairchu; 06.05.2010
comment
В списке рассылки библиотек в настоящее время обсуждается перенос MonadIO (и, возможно, MonadTrans из mtl в базу). Хотя было решено извлечь MonadIO или более общую MonadBase, несмотря на то, что MonadBase нужны MPTC, fundeps и т. Д. - person Edward KMETT; 06.05.2010
comment
@yairchu: Ничего особенного, просто горький опыт серьезных изменений, которые не должны влиять на функциональность, как правило, приводя как минимум к паре серьезных головных болей. Эдвард Кметт, кажется, осветил реальную текущую ситуацию гораздо лучше, чем я. - person C. A. McCann; 06.05.2010
comment
Поскольку я нашел этот пост чрезвычайно информативным. Я думал, что обновлю других гуглеров: mtl теперь зависит от трансформаторов, monads-fd теперь является заглушкой вокруг mtl. Так что используйте mtl, если вам нужны дополнительные полезности, или просто импортируйте трансформаторы, если в нем есть все, что вам нужно. - person jberryman; 04.09.2011
comment
Я не согласен с краткой характеристикой monadLib как использующей значительные расширения по сравнению с другими (в нынешнем виде). MonadLib использует только простые и безопасные расширения, тогда как MTL использует более опасные инструменты, такие как UndecidableInstances и CPP. - person Thomas M. DuBuisson; 02.08.2016

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

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

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

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

person Edward KMETT    schedule 05.05.2010
comment
В каком смысле сосуществовать? Используется одним и тем же пакетом? Импортирован в тот же модуль? Объединены в один трансформатор? Смешивание fundeps и TF в целом кажется мне плохой идеей. Как бы то ни было, я не очень широко использовал transformers & co. еще, но не заметил никаких проблем, кроме некоторых незначительных отличий API от mtl при переключении некоторого (довольно простого) кода. - person C. A. McCann; 05.05.2010
comment
Проблема сводится к тому, что вы можете загрузить только один пакет, который предоставляет данный модуль. Поэтому, если вы используете библиотеку, которая использует mtl, даже для внутреннего использования, вы не можете импортировать альтернативу. В настоящее время значительный процент хакеров каким-то образом использует mtl для внутренних целей. Некоторые люди предпочитают использовать семейства типов, и monads-tf дает им это, но имейте в виду, что на данный момент, пока не будет завершен рефакторинг transformers + monads-fd, это блокирует этот код от использования любых библиотек, которые транзитивно требуют MTL. . Это включает в себя довольно большие билеты. - person Edward KMETT; 06.05.2010
comment
Использование трансформаторов + монад- (tf | fd) в долгосрочной перспективе позволит избежать этого рассола, но мы еще не достигли этого. Между тем преобладание использования в пользу mtl. Путь обновления выглядит так, что следующая основная версия mtl будет переопределена как заглушка, которая импортирует monads-fd и трансформаторы. Разрыв основной версии предоставляет хороший способ заявить в вашем кабальном файле, что вам все равно, какую версию вы получите (т. Е. Вас не волнует, что State является псевдонимом типа или типом данных), и как только произойдет это изменение основной версии, тогда вам не нужно беспокоиться о том, разделяют ли все библиотеки, которые вы используете, одни и те же предубеждения. - person Edward KMETT; 06.05.2010
comment
Итак, в конечном итоге ваш опыт - это именно то, что трансформаторы / монады- (tf | fd) предназначены для поддержки. Но после того, как они были написаны, стало ясно, что сообщество ужасно плохо переключает библиотеки, когда нет веской причины для прыжка и массы устаревших причин остаться. Следовательно, необходимо переопределить mtl и сделать путь обновления понятным. - person Edward KMETT; 06.05.2010
comment
Отлично, спасибо за подробное разъяснение! Очевидно, что у кода, который я переключил, было мало внешних зависимостей - в основном, я думаю, привязки FFI. Я также не понимал, что конфликты имен модулей были настолько ... инвазивными, я полагаю? Это действительно делает вещи неловкими. :( - person C. A. McCann; 06.05.2010
comment
Это было написано в 2010 году. Правильно ли использовать mtl в 2016 году? - person Vlad the Impala; 12.12.2016
comment
Ага. Даже сейчас, в 2017 году, когда я успел ответить. знак равно - person Edward KMETT; 08.01.2017

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

person duplode    schedule 04.03.2017