Это известно, что моноиды потрясающе повсеместны в программировании. Они так повсеместны и так же полезны, что я, как 'проект хобби', работаю над системой, которая полностью основана на их свойствах (распределенное агрегирование данных). Для создания системы полезной, мне нужны полезные моноиды :)
Я уже знаю о них:
Теперь, давайте определим квазисвойство операции как свойство, которое содержит до отношения эквивалентности. Например, конкатенация списка является квазикоммутативной, если мы полагаем, что списки равной длины или с идентичным содержанием до перестановки эквивалентны.
Вот некоторые квазимоноиды и квазикоммутативные моноиды и полугруппы:
Какие другие действительно существуют?
Факторный моноид - это еще один способ образования моноидов (квазимоноидов?): Данный моноид M и отношение эквивалентности ~, совместимое с умножением, дает другой моноид. Например:
конечные мультимножества с объединением : если A * - свободный моноид (списки с конкатенацией), ~ - это отношение «перестановка», то A * / ~ - свободный коммутативный моноид.
конечные множества с объединением : Если ~ изменено так, чтобы не учитывать количество элементов (так "aa" ~ "a"), то A * / ~ является свободным коммутативным идемпотентным моноидом.
синтаксический моноид : любой регулярный язык порождает синтаксический моноид, который является частным от A * по отношению «неразличимость по языку». Здесь представляет собой реализацию этой идеи в виде дерева пальцев. Например, язык {a 3n : n natural} имеет Z 3 в качестве синтаксического моноида.
Факторные моноиды автоматически приходят с гомоморфизмом M -> M / ~, который является сюръективным.
«Двойная» конструкция - это субмоноиды. У них есть инъективный гомоморфизм A -> M.
Еще одна конструкция на моноидах - это тензорное произведение .
Моноиды позволяют возведение в степень возведением в квадрат в O (log n) и быстрое параллельное вычисление префиксных сумм . Также они используются в монаде Writer .
Стандартную библиотеку Haskell поочередно хвалят и критикуют за использование реальных математических терминов для классов типов. (На мой взгляд, это хорошо, без него я бы даже не узнал, что такое моноид!). В любом случае, вы можете проверить http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-Monoid.html , где есть еще несколько примеров:
первый (Just a) b = Just a first Nothing b = bи аналогично для последнего
Последний - лишь верхушка айсберга целое семейство моноидов, связанных с монадами и стрелами, но я не могу осмыслить их (кроме простых монадических эндоморфизмов). Но поиск в Google по monads monoids
дает довольно много результатов.