Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Boost.Hana: Monoid

Boost , ,

Boost.Hana  1.0.1
Your standard library for metaprogramming
Концепция<Monoid>представляет типы данных с ассоциативной бинарной операцией, которая имеет идентичность.

В частности,Моноидявляется базовой алгебраической структурой, обычно используемой в математике для построения более сложных алгебраических структур, таких как<Group>с,<Ring>с и так далее. Они полезны в нескольких контекстах, в частности, для определения свойств чисел гранулированным способом. По своей сути<Monoid>представляет собой набор<S>объектов наряду с бинарной операцией (скажем<+>), которая является ассоциативной и имеет идентичность в<S>. Существует множество примеров<Monoid>:

  • строки с конкатенацией и пустая строка как идентичность
  • целые числа с добавлением и0в качестве идентичности
  • целые числа с умножением и1как тождество
  • многие другие...

Как вы можете видеть с целыми числами, есть некоторые наборы, которые можно рассматривать как моноид более чем одним способом, в зависимости от выбора двоичной операции и идентичности. Названия метода, используемые здесь, относятся к моноиду целых чисел при сложении;<plus>является двоичной операцией и<zero>является элементом идентичности этой операции.

Minimal complete definition

<plus>и<zero>удовлетворяющие законам

Laws

Для всех объектов<x>,<y>и<z>из<Monoid><M>должны соблюдаться следующие законы:

plus(zero<M>(), x) == x // left zero
plus(x, zero<M>()) == x // right zero
plus(x, plus(y, z)) == plus(plus(x, y), z) // associativity

Concrete models

<hana::integral_constant>

Free model for non-boolean arithmetic data types

Тип данных<T>является арифметическим, если<std::is_arithmetic<T>::value>является истинным. Для небулевого арифметического типа данных<T>модель<Monoid>автоматически определяется установкой

plus(x, y) = (x + y)
zero<T>() = static_cast<T>(0)

Rationale for not making bool a Monoid by default

Во-первых, нет никакого смысла определять добавку<Monoid>по типу<bool>. Кроме того, имеет смысл определить<Monoid>с логическим соединением или разъединением. Однако C++ позволяет добавлять<bool>s, и названия методов этой концепции действительно предполагают добавление. В соответствии с принципом наименьшего удивления ни одна модель не предоставляется по умолчанию.

Structure-preserving functions

Пусть<A>и<B>будет два<Monoid>. Функция<f : A -> B>называетсяМоноидным морфизмом, если она сохраняет моноидальную структуру между<A>и<B>. Строго, для всех объектов<x, y>типа данных<A>,

f(plus(x, y)) == plus(f(x), f(y))
f(zero<A>()) == zero<B>()

Функции с этими свойствами прекрасно взаимодействуют с<Monoid>с, из-за чего и получают такую особую обработку.

Variables

constexpr auto boost::hana::plus
 Associative binary operation on a Monoid. More...
 
template<typename M >
constexpr auto boost::hana::zero
 Identity of plus. More...
 

Variable Documentation

constexpr auto boost::hana::plus

<#include <boost/hana/fwd/plus.hpp>>

Initial value:
= [](auto&& x, auto&& y) -> decltype(auto) {
return tag-dispatched;
}

Ассоциативная бинарная операция на<Monoid>.

Parameters
x,yДва объекта в сочетании с бинарной операцией<Monoid>.

Cross-type version of the method

Метод<plus>«перегружен» для обработки различных типов данных с определенными свойствами. В частности,<plus>определяется дляразличныхтипов данных<A>и<B>, так что

  1. AиBимеют общий тип данныхC, определяемый метафункциейcommon.
  2. A,BиC- всеMonoid, если принимать индивидуально
  3. to<C> : A -> Bиto<C> : B -> CявляютсяMonoidвстраиванием, как определеноis_embeddingметафункцией.

Определение<plus>для типов данных, удовлетворяющих вышеуказанным свойствам, получено путем установки

plus(x, y) = plus(to<C>(x), to<C>(y))

Example

// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
namespace hana = boost::hana;
BOOST_HANA_CONSTANT_CHECK(hana::plus(hana::int_c<3>, hana::int_c<5>) == hana::int_c<8>);
static_assert(hana::plus(1, 2) == 3, "");
static_assert(hana::plus(1.5f, 2.4) == 3.9, "");
int main() { }
template<typename M >
constexpr auto boost::hana::zero

<#include <boost/hana/fwd/zero.hpp>>

Initial value:
= []() -> decltype(auto) {
return tag-dispatched;
}

Идентичность<plus>.

Template Parameters
M<Monoid>Для возврата обратной связи.

Example

// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
namespace hana = boost::hana;
BOOST_HANA_CONSTANT_CHECK(hana::zero<hana::integral_constant_tag<int>>() == hana::int_c<0>);
static_assert(hana::zero<long>() == 0l, "");
int main() { }

Статья Boost.Hana: Monoid раздела может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 02:49:55/0.0041849613189697/0