Концепция<Monoid>представляет типы данных с ассоциативной бинарной операцией, которая имеет идентичность.
В частности,Моноидявляется базовой алгебраической структурой, обычно используемой в математике для построения более сложных алгебраических структур, таких как<Group>с,<Ring>с и так далее. Они полезны в нескольких контекстах, в частности, для определения свойств чисел гранулированным способом. По своей сути<Monoid>представляет собой набор<S>объектов наряду с бинарной операцией (скажем<+>), которая является ассоциативной и имеет идентичность в<S>. Существует множество примеров<Monoid>:
строки с конкатенацией и пустая строка как идентичность
целые числа с добавлением и0в качестве идентичности
целые числа с умножением и1как тождество
многие другие...
Как вы можете видеть с целыми числами, есть некоторые наборы, которые можно рассматривать как моноид более чем одним способом, в зависимости от выбора двоичной операции и идентичности. Названия метода, используемые здесь, относятся к моноиду целых чисел при сложении;<plus>является двоичной операцией и<zero>является элементом идентичности этой операции.
Minimal complete definition
<plus>и<zero>удовлетворяющие законам
Laws
Для всех объектов<x>,<y>и<z>из<Monoid><M>должны соблюдаться следующие законы:
Тип данных<T>является арифметическим, если<std::is_arithmetic<T>::value>является истинным. Для небулевого арифметического типа данных<T>модель<Monoid>автоматически определяется установкой
Во-первых, нет никакого смысла определять добавку<Monoid>по типу<bool>. Кроме того, имеет смысл определить<Monoid>с логическим соединением или разъединением. Однако C++ позволяет добавлять<bool>s, и названия методов этой концепции действительно предполагают добавление. В соответствии с принципом наименьшего удивления ни одна модель не предоставляется по умолчанию.
Structure-preserving functions
Пусть<A>и<B>будет два<Monoid>. Функция<f : A -> B>называетсяМоноидным морфизмом, если она сохраняет моноидальную структуру между<A>и<B>. Строго, для всех объектов<x, y>типа данных<A>,
Два объекта в сочетании с бинарной операцией<Monoid>.
Cross-type version of the method
Метод<plus>«перегружен» для обработки различных типов данных с определенными свойствами. В частности,<plus>определяется дляразличныхтипов данных<A>и<B>, так что
AиBимеют общий тип данныхC, определяемый метафункциейcommon.
A,BиC- всеMonoid, если принимать индивидуально
to<C> : A -> Bиto<C> : B -> CявляютсяMonoidвстраиванием, как определеноis_embeddingметафункцией.
Определение<plus>для типов данных, удовлетворяющих вышеуказанным свойствам, получено путем установки
Статья Boost.Hana: Monoid раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.