Использование монад, моноидов, функторов и стрел на практике - PullRequest
6 голосов
/ 28 ноября 2011

Я недавно натолкнулся на эту публикацию о полезных ресурсах для различных аспектов функционального программирования, таких как монады и моноиды и т. Д.

Но вопрос в том, что может использовать средний программистсделать из таких понятий.Я часто сталкиваюсь с «академическими» исследованиями по этим вопросам.Тем не менее, я никогда не встречал на практике (в реальном проекте) кого-либо, кто их использует.

Поэтому вопрос в том, существуют ли какие-либо широко используемые проекты с открытым исходным кодом в Haskell, которые действительно используют такие вещи,такие проекты, которые демонстрируют фактическую необходимость этой концепции в «производственном» программном обеспечении, а не в «академическом» программном обеспечении, написанном «просто для удовольствия».Было бы здорово создать такой список:

  • Монады - используются в таких проектах, как A и B, потому что в противном случае такой фрагмент кода выглядел бы намного сложнее.
  • То же самое длямоноиды.
  • То же самое для функторов.
  • То же самое для стрелок.

Ответы [ 3 ]

9 голосов
/ 28 ноября 2011

Многие из этих концепций настолько неявны в коде на Haskell, что проще перечислить примеры, которые их не используют (при условии, что вы можете их найти).Каждая программа на Haskell использует монады, по крайней мере, для ввода-вывода.

Все они широко используются, потому что они являются абстракциями, которые очень часто встречаются в коде.Рассмотрим функторы: отображение на контейнеры является довольно распространенной потребностью, поэтому имеет смысл иметь единый интерфейс для любой структуры данных, подобной контейнеру, и это именно то, что предоставляет Functor.Бывает, что даже концепция «контейнера» более конкретна, чем абстракция функтора, но, надеюсь, это демонстрирует смысл.

Монады: оконный менеджер XMonad является широко используемой программойкоторый широко использует монадные трансформаторы и структуру на молнии . STM - это библиотека, которая предоставляет новую монаду с полезными свойствами.

Моноиды: структура Sequence в пакете containers - , реализованная с моноидами .Кроме того, моноиды широко используются для моделирования наборов, списков и тому подобного, поскольку две моноидные операции обеспечивают пустой список и объединение (или пустой набор и объединение).

Стрелки: Yampa и HXT (Haskell XML Toolbox) сразу приходит на ум.

Функторы появляются везде.Для монадического кода довольно распространено иметь <$> с, что означает, что экземпляр Functor используется. Большинство Haskell парсеры интенсивно используют функторы.

6 голосов
/ 28 ноября 2011

Ответы Эртеса так же хороши, как и у Джона Л. Я просто хочу добавить кое-что о функторах и моноидах: я считаю, что большая часть терминологии Haskell, несмотря на ее точность, может быть немного неприятной для новых программистов на Haskell. Я всегда говорю новичкам, что моноиды можно рассматривать как «аппендибли», а функторы - как «маппбалы». Очевидно, что это упрощение имеет некоторую потерю, но оно помогает преодолеть начальные лексические барьеры языков. Интерфейс monoid (класс типов) имеет функции «append» и «identity», тогда как функтор просто определяет функцию map. Существует некоторая проскальзывание между извечной идеей добавления и отображения (например, суммирование является своего рода добавлением), но основная идея верна.

Будучи простыми интерфейсами для добавления и отображения, моноиды и функторы быстро обнаруживают множество применений: каждый раз, когда ваша структура данных должна поддерживать добавление или отображение, у вас есть время, когда ваши данные становятся экземпляром моноида или Функтор может упростить процесс.

Надеюсь, это было полезно.

Позже вот список библиотек, о которых вы спрашивали.

Функторы: посмотрите на библиотеку синтаксического анализа, как attparsec. http://hackage.haskell.org/package/attoparsec-0.10.0.2 Функторы позволяют легко составлять синтаксические анализаторы, так что вы можете писать легко создаваемые, легко читаемые синтаксические анализаторы даже для сложных данных. Сравните синтаксический анализатор attoparsec с сопоставимым регулярным выражением!

Monoid: посмотрите на любой массив, векторную библиотеку (http://hackage.haskell.org/packages/archive/vector/0.9/doc/html/Data-Vector.html)), чтобы увидеть использование Monoid для реализации применимости моноидов. Кроме того, это отличная статья о том, как заставить моноиды работать на вас http://blog.sigfpe.com/2009/01/haskell-monoids-and-their-uses.html

Монады: посмотрите на Data.Binary - простую и фундаментальную библиотеку Haskell - для идеального случая использования Монад. http://hackage.haskell.org/packages/archive/binary/0.4.1/doc/html/Data-Binary.html Используя монады, вы можете написать сложную серию инструкций для синтаксического анализа двоичных файлов.

6 голосов
/ 28 ноября 2011

Я использую стрелки и монады (и, следовательно, также функторы) для реальных приложений.Моя библиотека функционального реактивного программирования (FRP) Netwire объединяет все четыре упомянутые вами концепции и многое другое, а сама FRP также является шаблоном проектирования, который вы обычно знаете из академических кругов.Используются следующие понятия:

  • Стрелки и преобразователи стрел: Netwire предоставляет тип Wire, являющийся преобразователем стрел.
  • Монады и преобразователи монад: Wire обычно преобразуетсяк стеку монадных трансформаторов, обернутых стрелкой Kleisli.
  • Для запрещения проводов (например, исключений или не случившихся событий) используется моноид.

Версия 3 вот-вотвыпущен (надеюсь сегодня), который также принесет в игру (не связанные) семейства типов.

...