Примеры моноидов/полугрупп в программировании

Это известно, что моноиды потрясающе повсеместны в программировании. Они так повсеместны и так же полезны, что я, как 'проект хобби', работаю над системой, которая полностью основана на их свойствах (распределенное агрегирование данных). Для создания системы полезной, мне нужны полезные моноиды :)

Я уже знаю о них:

  • Числовая или матричная сумма
  • Числовое или матричное произведение
  • Минимум или максимум согласно общему порядку с вершиной или нижним элементом (в более общем плане, присоединитесь или встретьтесь в ограниченной решетке, или еще в более общем плане, продукт или побочный продукт в категории),
  • Объединение набора
  • Объединение карты, где к конфликтующим значениям присоединяются с помощью моноида
  • Пересечение подмножеств конечного множества (или просто пересечение набора, если мы говорим о полугруппах),
  • Пересечение карт с ограниченным ключевым доменом (то же здесь)
  • Слияние отсортированных последовательностей, возможно, с присоединением к ключевым равным значениям в другом моноиде/полугруппе
  • Ограниченное слияние отсортированных списков (то же как выше, но мы берем вершину N результата),
  • Декартово произведение двух моноидов или полугрупп
  • Конкатенация списка
  • Состав эндоморфизма.

Теперь, давайте определим квазисвойство операции как свойство, которое содержит до отношения эквивалентности. Например, конкатенация списка является квазикоммутативной, если мы полагаем, что списки равной длины или с идентичным содержанием до перестановки эквивалентны.

Вот некоторые квазимоноиды и квазикоммутативные моноиды и полугруппы:

  • Любой (a+b = a или b, если мы полагаем, что все элементы набора поставщика услуг эквивалентны),
  • Любой удовлетворяющий предикат (a+b = тот из a и b, который является непустым и удовлетворяет некоторый предикат P, если ни один действительно затем не аннулирует; если мы считаем все элементы, удовлетворяющие P эквивалентными),
  • Ограниченная смесь случайных выборок (xs+ys = случайная выборка размера N от конкатенации xs и ys; если мы полагаем, что какие-либо два образца с тем же распределением как целый набор данных эквивалентны),
  • Ограниченная смесь взвешенных случайных выборок
  • Давайте назовем его "топологическим слиянием": учитывая два нециклических и непротиворечащих графа зависимостей, график, который содержит все зависимости, указанные в обоих. Например, перечислите "конкатенацию", которая может произвести любую перестановку, в которой элементы каждого списка следуют в порядке (скажите, 123+456=142356).

Какие другие действительно существуют?

26
задан jkff 20 March 2010 в 21:43
поделиться

2 ответа

Факторный моноид - это еще один способ образования моноидов (квазимоноидов?): Данный моноид M и отношение эквивалентности ~, совместимое с умножением, дает другой моноид. Например:

  • конечные мультимножества с объединением : если A * - свободный моноид (списки с конкатенацией), ~ - это отношение «перестановка», то A * / ~ - свободный коммутативный моноид.

  • конечные множества с объединением : Если ~ изменено так, чтобы не учитывать количество элементов (так "aa" ~ "a"), то A * / ~ является свободным коммутативным идемпотентным моноидом.

  • синтаксический моноид : любой регулярный язык порождает синтаксический моноид, который является частным от A * по отношению «неразличимость по языку». Здесь представляет собой реализацию этой идеи в виде дерева пальцев. Например, язык {a 3n : n natural} имеет Z 3 в качестве синтаксического моноида.

Факторные моноиды автоматически приходят с гомоморфизмом M -> M / ~, который является сюръективным.

«Двойная» конструкция - это субмоноиды. У них есть инъективный гомоморфизм A -> M.

Еще одна конструкция на моноидах - это тензорное произведение .

Моноиды позволяют возведение в степень возведением в квадрат в O (log n) и быстрое параллельное вычисление префиксных сумм . Также они используются в монаде Writer .

6
ответ дан 28 November 2019 в 17:28
поделиться

Стандартную библиотеку Haskell поочередно хвалят и критикуют за использование реальных математических терминов для классов типов. (На мой взгляд, это хорошо, без него я бы даже не узнал, что такое моноид!). В любом случае, вы можете проверить http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-Monoid.html , где есть еще несколько примеров:

  • двойственный к любому моноиду является моноидом: для данного a + b определите новую операцию ++ с a ++ b = b + a
  • конъюнкцией и дизъюнкцией логических
  • над монадой Maybe (она же «опция» в Ocaml), первая и последняя. То есть
     первый (Just a) b = Just a 
    first Nothing b = b 
    и аналогично для последнего

Последний - лишь верхушка айсберга целое семейство моноидов, связанных с монадами и стрелами, но я не могу осмыслить их (кроме простых монадических эндоморфизмов). Но поиск в Google по monads monoids дает довольно много результатов.

5
ответ дан 28 November 2019 в 17:28
поделиться
Другие вопросы по тегам:

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