![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Boost.Hana: FunctionalBoost , ,
< = [](auto&& ...variables) { return forwarded(f)(forwarded(variables)..., forwarded(args)...); }; }; } constexpr auto capture Создать функцию захвата заданных переменных. Definition: capture.hpp:45 Создать функцию захвата заданных переменных. Учитывая 0 или более переменных,< capture(vars...)(f)(args...) == f(vars..., args...)
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 <boost/hana/assert.hpp> #include <boost/hana/config.hpp> #include <boost/hana/functional/capture.hpp> namespace hana = boost::hana; int main() { return x + y + z; }; BOOST_HANA_CONSTEXPR_CHECK(hana::capture(1, 2, 3)(sum)() == 6); BOOST_HANA_CONSTEXPR_CHECK(hana::capture(1, 2)(sum)(3) == 6); }
< = [](auto&& f1, auto&& f2, ..., auto&& fn) { return forwarded(f1)( forwarded(f2)( ... forwarded(fn)(forwarded(x)) ), forwarded(xs)... ); } } constexpr auto capture Создать функцию захвата заданных переменных. Definition: capture.hpp:45 Возвращают состав двух функций или более. < compose(f, g)(x, y...) == f(g(x), y...) Если вам нужна форма<
Proof of associativity == f(g(h(x)), xs...) == f(g(h(x)), xs...) 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 <boost/hana/assert.hpp> #include <boost/hana/config.hpp> #include <boost/hana/functional/compose.hpp> namespace hana = boost::hana; int main() { BOOST_HANA_CONSTEXPR_LAMBDA auto to_char = [](int x) { return static_cast<char>(x + 48); }; BOOST_HANA_CONSTEXPR_LAMBDA auto increment = [](auto x) { return x + 1; }; }
template<std::size_t n>
< = [](auto&& f) { ... return forwarded(f)( forwarded(x1), forwarded(x2), ..., forwarded(xn) ); }; }; }; } constexpr auto capture Создать функцию захвата заданных переменных. Definition: capture.hpp:45 Карри выполняет функцию до заданного числа аргументов. Карри— это метод, в котором мы рассматриваем функцию, принимающую несколько аргументов (или, эквивалентно, набор аргументов), и превращаем ее в функцию, которая принимает один аргумент и возвращает функцию для обработки оставшихся аргументов. Чтобы помочь визуализировать, давайте обозначим тип функции< (X1, ..., Xn) -> R Затем карриирование — это процесс принятия< X1 -> (X2 -> (... -> (Xn -> R))) Это дает нам следующую эквивалентность, где< f(x1, ..., xn) == g(x1)...(xn) Карри может быть полезен в нескольких ситуациях, особенно при работе с функциями более высокого порядка. Эта утилита< curry<n>(f)(x1)...(xn) == f(x1, ..., xn) Обратите внимание, что< В отличие от обычного карри, эта реализация также позволяет вызывать криволинейную функцию с несколькими аргументами одновременно. Таким образом, следующее всегда curry<n>(f)(x1, ..., xk) == curry<n - k>(f)(x1)...(xk) Конечно, это требует, чтобы< Другое «расширение» заключается в том, что< 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 <boost/hana/assert.hpp> #include <boost/hana/config.hpp> #include <boost/hana/functional/curry.hpp> namespace hana = boost::hana; int main() { BOOST_HANA_CONSTEXPR_LAMBDA auto add = [](auto x, auto y, auto z) { return x + y + z; }; BOOST_HANA_CONSTEXPR_CHECK(hana::curry<3>(add)(1)(2)(3) == 1 + 2 + 3); BOOST_HANA_CONSTEXPR_CHECK(hana::curry<3>(add)(1)(2, 3) == hana::curry<3>(add)(1)(2)(3)); BOOST_HANA_CONSTEXPR_CHECK(hana::curry<3>(add)(1, 2, 3) == hana::curry<3>(add)(1)(2)(3)); // curry with a nullary function BOOST_HANA_CONSTEXPR_LAMBDA auto two = []() { return 2; }; BOOST_HANA_CONSTEXPR_CHECK(hana::curry<0>(two)() == two()); }
< = [](auto&& f) { return forwarded(f)(forwarded(g)(x...)...); }; }; } constexpr auto capture Создать функцию захвата заданных переменных. Definition: capture.hpp:45 Вызов функции с результатами вызова других функций на ее аргументы. В частности,< demux(f)(g...)(x...) == f(g(x...)...) Каждый< Это называется<
Signature< \[ \mathtt{demux} : (B_1 \times \dotsb \times B_n \to C) \to ((A_1 \times \dotsb \times A_n \to B_1) \times \dotsb \times (A_1 \times \dotsb \times A_n \to B_n)) \to (A_1 \times \dotsb \times A_n \to C) \] Его можно переписать более подробно, как \[ \mathtt{demux} : \left(\prod_{i=1}^n B_i \to C \right) \to \prod_{j=1}^n \left(\prod_{i=1}^n A_i \to B_j \right) \to \left(\prod_{i=1}^n A_i \to C \right) \] Link with normal compositionПодпись< \[ \mathtt{compose} : (B \to C) \times (A \to B) \to (A \to C) \] Достоверным наблюдением является то, что это точно совпадает с типом< Однако, давайте теперь рассмотрим изогнутую версию< \[ \mathtt{curry_2(compose)} : (B \to C) \to ((A \to B) \to (A \to C)) \] Для остальной части этого объяснения мы просто рассмотрим криволинейную версию< \[ \mathtt{compose(compose, compose)} : (B \to C) \to (A_1 \to A_2 \to B) \to (A_1 \to A_2 \to C) \] Если мы глубоко отбросим вышеприведенное выражение, мы получим \[ \mathtt{compose(compose, compose)} : (B \to C) \times (A_1 \times A_2 \to B) \to (A_1 \times A_2 \to C) \] Эта подпись точно такая же, как и у< \[ \mathtt{compose(compose(compose, compose), compose)} : (B \to C) \to (A_1 \to A_2 \to A_3 \to B) \to (A_1 \to A_2 \to A_3 \to C) \] Который не вступает в \[ \mathtt{compose(compose(compose, compose), compose)} : (B \to C) \times (A_1 \times A_2 \times A_3 \to B) \to (A_1 \times A_2 \times A_3 \to C) \] Эта подпись точно такая же, как и у< // ^^^^^^^^^^^^^^^^^^^^^ n times Более подробную информацию об этом можно найти здесь. Кроме того, я не уверен, как это понимание может быть обобщено на более чем одну функцию< Proof of associativity in the binary case107 является ассоциативным, когда используется только с двумя функциями. Действительно, учитывая функции< С другой стороны, мы имеем < 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 <boost/hana/equal.hpp> #include <boost/hana/functional/demux.hpp> #include <boost/hana/functional/placeholder.hpp> #include <boost/hana/tuple.hpp> namespace hana = boost::hana; using hana::_; constexpr auto f = hana::demux(hana::make_tuple)( _ - _, _ * _, _ / _ ); static_assert( f(10, 4) == hana::make_tuple( 10 + 4, 10 - 4, 10 * 4, 10 / 4 ) , ""); int main() { }
< = [](auto&& f) { return forwarded(f)(fix(f), forwarded(x)...); }; } constexpr auto fix Возврат функции, вычисляющей фиксированную точку функции. Definition: fix.hpp:53 constexpr auto capture Создать функцию захвата заданных переменных. Definition: capture.hpp:45 Возврат функции, вычисляющей фиксированную точку функции. < В частности,< Это определение позволяет< В большинстве случаев более удобно и эффективно определять рекурсивные функции без использования комбинатора с фиксированной точкой. Однако в некоторых случаях<
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 <boost/hana/assert.hpp> #include <boost/hana/config.hpp> #include <boost/hana/functional/fix.hpp> namespace hana = boost::hana; if (n == 0) return 1; else return n * fact(n - 1); }); int main() { BOOST_HANA_CONSTEXPR_CHECK(factorial(5) == 120); }
< = [](auto&& f) { return forwarded(f)(forwarded(y), forwarded(x), forwarded(z)...); }; } constexpr auto capture Создать функцию захвата заданных переменных. Definition: capture.hpp:45 Назовите функцию с двумя первыми обратными аргументами. В частности,< flip(f)(x, y, z...) == f(y, x, z...) 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 <boost/hana/assert.hpp> #include <boost/hana/config.hpp> #include <boost/hana/functional/flip.hpp> namespace hana = boost::hana; return x - y - z; }; int main() { BOOST_HANA_CONSTEXPR_CHECK(minus(3, 0) == 3 - 0); BOOST_HANA_CONSTEXPR_CHECK(hana::flip(minus)(3, 0) == 0 - 3); BOOST_HANA_CONSTEXPR_CHECK(minus(3, 0, 1) == 3 - 0 - 1); BOOST_HANA_CONSTEXPR_CHECK(hana::flip(minus)(3, 0, 1) == 0 - 3 - 1); }
< = [](auto&& x) -> decltype(auto) { return forwarded(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 <boost/hana/functional/id.hpp> namespace hana = boost::hana; static_assert(hana::id(1) == 1, ""); int main() { }
< = [](auto f) { return unspecified; } Возврат эквивалентной функции, которая также может быть применена в фиксации. В частности,< Следовательно, возвращенная функция все еще может быть применена с использованием обычного синтаксиса вызова функции, но она также получает возможность быть примененной в инфиксной записи. Синтаксис инфикса обеспечивает большую выразительность, особенно при использовании в сочетании с некоторыми алгоритмами более высокого порядка. Поскольку< Тем не менее, обратите внимание, что применение более одного аргумента в фиксированной записи к одной и той же стороне оператора приведет к утверждению времени компиляции: Кроме того, функция, созданная с помощью< Rationales
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 <boost/hana/assert.hpp> #include <boost/hana/config.hpp> #include <boost/hana/equal.hpp> #include <boost/hana/functional/infix.hpp> #include <boost/hana/pair.hpp> namespace hana = boost::hana; // this could be a more efficient implementation return hana::make_pair(x / y, x % y); }); int main() { BOOST_HANA_CONSTEXPR_CHECK((42 ^divmod^ 23) == hana::make_pair(1, 19)); }
template<std::size_t n>
< = [](auto&& f) { return f(f( ... f(forwarded(x)))); }; } constexpr auto capture Создать функцию захвата заданных переменных. Definition: capture.hpp:45 Применяет к своему аргументу другую функцию< При наличии функции< iterate<n>(f, x) == f(f( ... f(x))) ^^^^^^^^^^ n times total Если< В дополнение к тому, что описано выше,< iterate<n>(f)(x) == iterate<n>(f, x) Это предусмотрено для удобства, и оно оказывается особенно полезным в сочетании с алгоритмами более высокого порядка. SignatureУчитывая функцию \(f : T \to T \) и<
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 <boost/hana/equal.hpp> #include <boost/hana/functional/iterate.hpp> #include <boost/hana/functional/placeholder.hpp> #include <boost/hana/tuple.hpp> namespace hana = boost::hana; constexpr auto next_10 = hana::iterate<10>(hana::_ + 1); static_assert(next_10(3) == 13, ""); constexpr auto xs = hana::make_tuple(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); static_assert(hana::iterate<3>(hana::make_tuple, xs) == hana::make_tuple(hana::make_tuple(hana::make_tuple(xs))), ""); int main() { }
< = [](auto&& f, auto&& ...g) { return forwarded(f)(forwarded(g)(forwarded(x))...); }; } constexpr auto capture Создать функцию захвата заданных переменных. Definition: capture.hpp:45 Вызов функции в результате вызова других функций на ее аргументы, шаг за шагом. В частности,< lockstep(f)(g1, ..., gN)(x1, ..., xN) == f(g1(x1), ..., gN(xN)) Поскольку каждый< 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 <boost/hana/functional/lockstep.hpp> #include <boost/hana/plus.hpp> namespace hana = boost::hana; constexpr int to_int(char c) { return static_cast<int>(c) - 48; } constexpr int increment(int i) { return i + 1; } int main() { }
< return forwarded(f)(g(forwarded(x))...); }; }) constexpr auto capture Создать функцию захвата заданных переменных. Definition: capture.hpp:45 constexpr auto infix Возврат эквивалентной функции, которая также может быть применена в фиксации. Definition: infix.hpp:79 Вызов функции в результате вызова другой функции на каждый аргумент. В частности,< on(f, g)(x...) == f(g(x)...) Для удобства<
Proof of associativity == f(g(h(xs))...) == f(g(h(xs))...) 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 <boost/hana/first.hpp> #include <boost/hana/functional/on.hpp> #include <boost/hana/integral_constant.hpp> #include <boost/hana/less.hpp> #include <boost/hana/pair.hpp> #include <boost/hana/plus.hpp> #include <boost/hana/sort.hpp> #include <boost/hana/tuple.hpp> #include <boost/hana/type.hpp> namespace hana = boost::hana; // infix application hana::make_pair(hana::int_c<3>, 'x'), hana::make_pair(hana::int_c<1>, hana::type_c<void>), hana::make_pair(hana::int_c<2>, 9876) )); static_assert(sorted == hana::make_tuple( hana::make_pair(hana::int_c<1>, hana::type_c<void>), hana::make_pair(hana::int_c<2>, 9876), hana::make_pair(hana::int_c<3>, 'x') ), ""); // function call syntax constexpr auto x = hana::make_pair(1, 2); constexpr auto y = hana::make_pair(10, 20); int main() { }
< = [](auto&& f1, auto&& f2, ..., auto&& fn) { return forwarded(fk)(forwarded(x)...); }; } constexpr auto capture Создать функцию захвата заданных переменных. Definition: capture.hpp:45 Выберите одну из нескольких функций для вызова на основе разрешения перегрузки. В частности,< overload(f1, f2, ..., fn)(x...) == fk(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 <boost/hana/assert.hpp> #include <boost/hana/functional/overload.hpp> #include <iostream> #include <string> namespace hana = boost::hana; auto on_string = [](std::string const& s) { std::cout << "matched std::string: " << s << std::endl; return s; }; auto on_int = [](int i) { std::cout << "matched int: " << i << std::endl; return i; }; auto f = hana::overload(on_int, on_string); int main() { // prints "matched int: 1" BOOST_HANA_RUNTIME_CHECK(f(1) == 1); // prints "matched std::string: abcdef" }
< = [](auto&& f1, auto&& f2, ..., auto&& fn) { return forwarded(fk)(forwarded(x)...); }; } constexpr auto capture Создать функцию захвата заданных переменных. Definition: capture.hpp:45 Назовите первую функцию, которая производит действительное выражение вызова. Данная функция< overload_linearly(f1, ..., fn)(args...) == fk(args...) где< 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 <boost/hana/assert.hpp> #include <boost/hana/functional/overload_linearly.hpp> #include <string> namespace hana = boost::hana; auto f = hana::overload_linearly( [](int i) { return i + 1; }, [](std::string s) { return s + "d"; }, ); int main() { BOOST_HANA_RUNTIME_CHECK(f(1) == 2); BOOST_HANA_RUNTIME_CHECK(f(2.2) == static_cast<int>(2.2) + 1); }
< = [](auto&& f, auto&& ...x) { return forwarded(f)(forwarded(x)..., forwarded(y)...); }; } constexpr auto capture Создать функцию захвата заданных переменных. Definition: capture.hpp:45 Частично применить функцию к некоторым аргументам. Учитывая функцию< partial(f, x...)(y...) == f(x..., 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) #include <boost/hana/functional/partial.hpp> #include <boost/hana/plus.hpp> namespace hana = boost::hana; static_assert(increment(2) == 3, ""); int main() { }
< Создание простых функций, представляющих операторов C++ inline. В частности,< Операторы также могут быть частично применены к одному аргументу: При вызове большего количества аргументов, чем требуется, функции, созданные с помощью< Это делает функции, созданные с помощью< Supported operators
Более сложные функции, такие как возможность компоновать заполнители в более крупные объекты функций, не поддерживаются. Это нарочно; вы должны либо использовать общие лямбды C++14, либо библиотеку, такую какBoost.Phoenix, если вам нужно больше оружия. Цель состоит в том, чтобы спасти пару персонажей в простых ситуациях. 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 <boost/hana/functional/placeholder.hpp> namespace hana = boost::hana; static_assert(plus(1, 2) == 1 + 2, ""); constexpr auto increment = hana::_ + 1; static_assert(increment(1) == 2, ""); constexpr auto twice = 2 * hana::_; static_assert(twice(1) == 2, ""); // Extra arguments are ignored. static_assert(twice(1, "ignored") == 2, ""); int main() { }
< = [](auto&& f, auto&& ...x) { return forwarded(f)(forwarded(y)..., forwarded(x)...); }; } constexpr auto capture Создать функцию захвата заданных переменных. Definition: capture.hpp:45 Частично применить функцию к некоторым аргументам. При наличии функции< reverse_partial(f, x...)(y...) == f(y..., 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 <boost/hana/div.hpp> #include <boost/hana/functional/reverse_partial.hpp> namespace hana = boost::hana; static_assert(half(4) == 2, ""); static_assert(half(8) == 4, ""); int main() { } Статья Boost.Hana: Functional раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
| ©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
| |