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

Boost.Hana: Functor

Boost , ,

Boost.Hana  1.0.1
Your standard library for metaprogramming
Концепция Functor представляет типы, которые могут быть отображены.

Intuitively, a Functor - это своего рода коробка, которая может содержать общие данные и отображать функцию над этими данными для создания новой, преобразованной коробки. Поскольку мы заинтересованы только в отображении функции над содержанием черного ящика, единственное реальное требование для того, чтобы быть фанктором, состоит в том, чтобы предоставить функцию, которая может сделать картирование, а также пару гарантий того, что картирование хорошо себя вести. Эти требования четко изложены в законах ниже. Модель, захваченная Functor, очень общая, что делает ее широко полезной. Многие объекты могут быть сделаны Функтор так или иначе, наиболее очевидным примером являются последовательности с обычным отображением функции на каждом элементе. Хотя эта документация не будет вдаваться в гораздо более подробную информацию о природе фанкторов, Typeclassopedia является хорошим ресурсом, ориентированным на Haskell для такой информации.

Functors - это параметрические типы данных, которые параметризируются по типу данных содержащихся в них объектов. Как и везде в Хане, эта параметричность находится только на уровне документации и не выполняется.

В этой библиотеке функция картирования называется transform после алгоритма std::transform, но другие языки программирования дали ему разные имена (обычно map).

Note
The word functor comes from functional programming, where the concept has been used for a while, notably in the Haskell programming language. Haskell people borrowed the term from category theory, which, broadly speaking, is a field of mathematics dealing with abstract structures and transformations between those structures.

Minimal complete definitions

  1. transform
    Когдаtransformопределено,adjust_ifопределено аналогично
    , еслипред(x), тоf(x)
    }
    [ORIG_END] -->
  2. adjust_if
    Когдаadjust_ifопределено,transformопределено аналогично[ORIG_END] -->

Laws

Пусть xs будет Functor с тегом F(A), \(f : A \to B \) и \(g : B \to C \). Должны соблюдаться следующие законы:

transform(xs, id) == xs
transform(xs, compose(g, f)) == transform(transform(xs, f), g)

В первой строке говорится, что отображение функции идентификации не должно делать ничего, что не позволяет фанктору делать что-то неприятное за кулисами. Вторая линия гласит, что отображение состава двух функций совпадает с отображением первой функции, а затем второй по результату. В то время как обычные законы фанктора обычно ограничиваются вышеуказанным, эта библиотека включает другие методы удобства, и они должны удовлетворять следующим уравнениям. Let xs be a Functor with tag F(A), \( f : A \to A \), \( \mathrm{pred} : A \to \mathrm{Bool} \) для некоторых Logical Bool, и oldval, newval, value объектов тега A. Тогда,

adjust(xs, value, f) == adjust_if(xs, equal.to(value), f)
adjust_if(xs, pred, f) == transform(xs, [](x){
if pred(x) then f(x) else x
})
replace_if(xs, pred, value) == adjust_if(xs, pred, always(value))
replace(xs, oldval, newval) == replace_if(xs, equal.to(oldval), newval)
fill(xs, value) == replace_if(xs, always(true), value)

Определение по умолчанию методов удовлетворит эти уравнения.

Concrete models

хана::lazy, хана::необязательно, хана::tuple

Structure-preserving functions for Functors

Картографию между двумя фанкторами, которая также сохраняет законы фанктора, называют естественной трансформацией (термин исходит из теории категорий). Естественная трансформация - это функция f от фанктора F до фанктора G, так что для каждой другой функции g с соответствующей подписью и для каждого объекта xs тега F(X),

f(transform(xs, g)) == transform(f(xs), g)

Существует несколько примеров таких трансформаций, таких как to<tuple_tag>, когда применяется к опционному значению. Действительно, для любой функции g и хана:: Опционно opt,

to<tuple_tag>(transform(opt, g)) == transform(to<tuple_tag>(opt), g)

Конечно, естественные преобразования не ограничиваются функциями to<...>. Однако обратите внимание, что любая конверсионная функция между Functors должна быть естественной для поведения преобразования быть интуитивной.

Variables

constexpr auto boost::hana::adjust
 Apply a function on all the elements of a structure that compare equal to some value. More...
 
constexpr auto boost::hana::adjust_if
 Apply a function on all the elements of a structure satisfying a predicate.Given a Functor, a predicate pred and a function f, adjust_if will adjust the elements of the Functor that satisfy the predicate with the function f. In other words, adjust_if will return a new Functor equal to the original one, except that the elements satisfying the predicate will be transformed with the given function. Elements for which the predicate is not satisfied are left untouched, and they are kept as-is in the resulting Functor. More...
 
constexpr auto boost::hana::fill
 Replace all the elements of a structure with a fixed value. More...
 
constexpr auto boost::hana::replace
 Replace all the elements of a structure that compare equal to some value with some new fixed value. More...
 
constexpr auto boost::hana::replace_if
 Replace all the elements of a structure satisfying a predicate with a fixed value. More...
 
constexpr auto boost::hana::transform
 Map a function over a Functor. More...
 

Variable Documentation

constexpr auto boost::hana::adjust

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

Initial value:
= [](auto&& xs, auto&& value, auto&& f) {
return tag-dispatched;
}
constexpr auto value
Return the compile-time value associated to a constant.This function returns the value associated to ...
Definition: value.hpp:54

Применяйте функцию на все элементы структуры, которые сравниваются с какой-то ценностью.

Signature

Учитывая F Functor и U тип, который можно сравнить с T, подпись \( \mathtt{adjust} : F(T) \times U \times (T \to T) \ to F(T) \

Parameters
xsСтруктура для регулировки с f.
valueОбъект, который сравнивается с каждым элементом x структуры. Элементы структуры, которые сравниваются с значением , корректируются с функцией f.
fФункция, называемая f(x) на элементе(ах) структуры, которые сравниваются равным стоимости.

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_CONSTEXPR_LAMBDA auto negate = [](auto x) {
return -x;
};
int main() {
hana::adjust(hana::make_tuple(1, 4, 9, 2, 3, 4), 4, negate)
==
hana::make_tuple(1, -4, 9, 2, 3, -4)
);
}
constexpr auto boost::hana::adjust_if

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

Initial value:
= [](auto&& xs, auto const& pred, auto const& f) {
return tag-dispatched;
}

Применяйте функцию на все элементы структуры, удовлетворяющие предикату. Учитывая Functor, предикат pred и функцию f, adjust_if будет корректировать элементы Functor, которые удовлетворяют предика с функцией f. Другими словами, adjust_if вернет новый Functor, равный оригинальному, за исключением того, что элементы, удовлетворяющие предикату, будут преобразованы с заданной функцией. Элементы, для которых предикат не удовлетворяется, остаются нетронутыми, и они хранятся как-это в результате Functor.

Signature

Учитывая Functor F и Logical Bool, подпись \(\mathtt{adjust_if}: F(T) \times (T \to Bool) \times (T \to T) \to T) \to F(T) \

Parameters
xsСтруктура для регулировки с f.
predФункция, называемая pred(x) для каждого элемента Functor, и возвращение f должно быть применено к этому элементу.
fФункция, называемая f(x) на элементе ( элементах) Functor, который удовлетворяет предикату.

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_CONSTEXPR_LAMBDA auto negative = [](auto x) {
return x < 0;
};
BOOST_HANA_CONSTEXPR_LAMBDA auto negate = [](auto x) {
return -x;
};
int main() {
hana::adjust_if(hana::make_tuple(-3, -2, -1, 0, 1, 2, 3), negative, negate)
==
hana::make_tuple(3, 2, 1, 0, 1, 2, 3)
);
}
constexpr auto boost::hana::fill

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

Initial value:
= [](auto&& xs, auto&& value) {
return tag-dispatched;
}
constexpr auto value
Return the compile-time value associated to a constant.This function returns the value associated to ...
Definition: value.hpp:54

Заменить все элементы структуры фиксированным значением.

Signature

Учитывая F Functor, подпись является \(\mathtt{fill} : F(T) \times U \to F(U) \

Parameters
xsСтруктура для заполнения с значением .
valueЗначение, по которому каждый элемент x структуры заменяется, безусловно.

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;
int main() {
static_assert(
hana::fill(hana::make_tuple(1, '2', 3.3, nullptr), 'x')
==
hana::make_tuple('x', 'x', 'x', 'x')
, "");
BOOST_HANA_CONSTANT_CHECK(hana::fill(hana::nothing, 'x') == hana::nothing);
static_assert(hana::fill(hana::just('y'), 'x') == hana::just('x'), "");
}
constexpr auto boost::hana::replace

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

Initial value:
= [](auto&& xs, auto&& oldval, auto&& newval) {
return tag-dispatched;
}

Заменить все элементы структуры, которые сравниваются, равным приблизительно стоимости с некоторым новым фиксированным значением.

Signature

Учитывая F Functor и U тип, который можно сравнить с T, подпись \( \mathtt{replace} : F(T) \times U \times T \to F(T) \

Parameters
xsСтруктура для замены элементов.
oldvalОбъект по сравнению с каждым элементом структуры. Элементы структуры, которые сравниваются с oldval, заменяются на newval в новой структуре.
newvalЗначение, по которому заменяется каждый элемент x структуры, сравнивающей oldval.

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;
static_assert(
hana::replace(hana::make_tuple(1, 1, 1, 2, 3, 1, 4, 5), 1, 0)
==
hana::make_tuple(0, 0, 0, 2, 3, 0, 4, 5)
, "");
int main() { }
constexpr auto boost::hana::replace_if

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

Initial value:
= [](auto&& xs, auto&& predicate, auto&& value) {
return tag-dispatched;
}
constexpr auto value
Return the compile-time value associated to a constant.This function returns the value associated to ...
Definition: value.hpp:54

Заменить все элементы структуры, удовлетворяющие прецеденту, фиксированным значением.

Signature

Учитывая F Functor и Bool a Logical, подпись \( \matht{replace_if} : F(T) \times (T \to Bool) \times T \to F(T) \)

Parameters
xsСтруктура для замены элементов.
predicateФункция называется predicate(x) для элемента(ов) x структуры и возврата Logical x следует заменить на значение.
valueЗначение, с помощью которого каждый элемент x структуры, для которой predicate возвращает истинное значение Logical, заменяется.

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_CONSTEXPR_LAMBDA auto negative = [](auto x) {
return x < 0;
};
int main() {
hana::replace_if(hana::make_tuple(-3, -2, -1, 0, 1, 2, 3), negative, 0)
==
hana::make_tuple(0, 0, 0, 0, 1, 2, 3)
);
}
constexpr auto boost::hana::transform

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

Initial value:
= [](auto&& xs, auto&& f) {
return tag-dispatched;
}

Карта функции над Функтором.

Signature

Учитывая F Functor, подпись является \(\mathtt{transform} : F(T) \times (T\to U) \to F(U) \)

Parameters
xsСтруктура на карте f.
fФункция, называемая f(x) на элемент(ы) x структуры, и возвращение нового значения для замены x в структуре.

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)
#include <sstream>
#include <string>
#include <type_traits>
namespace hana = boost::hana;
using namespace std::literals;
auto to_string = [](auto x) {
std::ostringstream ss;
ss << x;
return ss.str();
};
int main() {
hana::transform(hana::make_tuple(1, '2', "345", std::string{"67"}), to_string)
==
hana::make_tuple("1", "2", "345", "67")
);
BOOST_HANA_CONSTANT_CHECK(hana::transform(hana::nothing, to_string) == hana::nothing);
BOOST_HANA_RUNTIME_CHECK(hana::transform(hana::just(123), to_string) == hana::just("123"s));
hana::transform(hana::tuple_t<void, int(), char[10]>, hana::template_<std::add_pointer_t>)
==
hana::tuple_t<void*, int(*)(), char(*)[10]>
);
}

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




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 03:20:42/0.005728006362915/0