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

Boost.Hana: boost::hana::lazy< implementation_defined > Struct Template Reference

Boost , ,

Boost.Hana  1.0.1
Your standard library for metaprogramming
<hana::lazy>реализует поверхностную лень через монадический интерфейс.

Важно понимать, что лень, реализуемая<lazy>, только поверхностна; только функциональные приложения, сделанные внутри<lazy>монады, могут быть сделаны ленивыми, а не все их подвыражения.

Note
The actual representation of hana::lazy is completely implementation-defined. Lazy values may only be created through hana::make_lazy, and they can be stored in variables using auto, but any other assumption about the representation of hana::lazy<...> should be avoided. In particular, one should not rely on the fact that hana::lazy<...> can be pattern-matched on, because it may be a dependent type.

Modeled concepts

  1. Functor
    Применение функции над ленивым значением сtransformвозвращает результат применения функции в качестве ленивого значения.
    // Авторское право Louis Dionne 2013-2016
    // Распространяется под лицензией Boost Software License, версия 1.0.
    // (См. сопроводительный файл LICENSE.md или копию на http://boost.org/LICENSE_1_0.txt)
    пространство именхана =бустер::хана;
    с использованиемхана::_;
    intmain() {
    статический_ассерт (хана::evalхана::трансформировать(хана::make_lazy(4 /_* 3)) == (4 / 1) * 3,"";
    hana::transform(hana::make_lazy(4 /_)(0),_* 3);// никогда не оценивался
    ]
    [ORIG_END] -->
  2. Applicative
    Нормальное значение можно поднять до ленивого значения, используяlift<lazy_tag>. Ленивая функция может быть лениво применена к ленивому значению с помощьюap.
  3. Monad
    Монадаlazyпозволяет объединять ленивые вычисления в более крупные ленивые вычисления. Обратите внимание, что оператор|может использоваться вместо функцииchain.
    // Авторское право Louis Dionne 2013-2016
    // Распространяется по лицензии Boost Software License, версия 1.0.
    // [См. сопроводительный файл LICENSE.md или копию по http://boost.org/LICENSE_1_0.txt]
    [название типа
    [поиск]
    [поиск]
    [поиск]
    [поиск]
    [поток]
    [поиск][поток]
    [поток]
    [поиск][поиск][поиск][поиск][поиск] [[ORIG_END] -->
  4. Comonad
    Комонадаlazyпозволяет оценивать ленивые вычисления, чтобы получить их результат, и лениво применять функции, принимающие ленивые входы к ленивым значениям. Этот поств блогесодержит более подробную информацию о ленивых оценках и комонадах.
    // Авторское право Louis Dionne 2013-2016
    // Распространяется по лицензии Boost Software License, Version 1.0.
    // [См. сопроводительный файл LICENSE.md или копию по адресу http://boost.org/LICENSE_1_0.txt]
    ]
    ] [ BOOST_HANA_RUNTIME_CHECKhana::extract(i_plus_one) == 2);
    }
    [ORIG_END] -->
Note
hana::lazy only models a few concepts because providing more functionality would require evaluating the lazy values in most cases. Since this raises some issues such as side effects and memoization, the interface is kept minimal.

Synopsis of associated functions

constexpr auto eval
 Evaluate a lazy value and return it. More...
 
template<>
constexpr auto make< lazy_tag >
 Lifts a normal value to a lazy one. More...
 
constexpr auto make_lazy = make<lazy_tag>
 Alias to make<lazy_tag>; provided for convenience. More...
 

Friends

template<typename... T, typename F >
constexpr auto operator| (lazy< T... >, F)
 Equivalent to hana::chain.
 

Associated functions

template<typename implementation_defined >
constexpr auto eval
related
Initial value:
= [](auto&& see_documentation) -> decltype(auto) {
return tag-dispatched;
}

Оцените ленивую ценность и верните ее.

При ленивом выражении<expr>,<eval>оценивает<expr>и возвращает результат как нормальное значение. Однако для удобства<eval>также можно использовать с нулевыми и унарными функциональными объектами. В частности, если<expr>не является<hana::lazy>, он вызывается без каких-либо аргументов вообще и результат этого вызова<expr()>возвращается. В противном случае, если<expr()>плохо сформирован, то<expr(hana::id)>возвращается. Если это выражение плохо сформировано, то запускается ошибка времени компиляции.

Причина, по которой в<eval>разрешены нулевые вызовы, заключается в том, что это позволяет использовать нулевые лямбды в качестве ленивых ветвей<eval_if>, что удобно. Причина, по которой разрешены унарные вызовы и вызов их<hana::id>, заключается в том, что это позволяет отложить оценку выбранных выражений внутри вызова. Как это можно сделать, описано в<hana::eval_if>.

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::eval(hana::make_lazy(hana::_ + 1)(3)) == 4, "");
int main() { }
template<typename implementation_defined >
template<>
constexpr auto make< lazy_tag >
related
Initial value:
= [](auto&& x) {
return lazy<implementation_defined>{forwarded(x)};
}

Поднимает нормальное значение до ленивого.

<make<lazy_tag>>может быть использован для подъема нормального значения или вызова функции в ленивое выражение.<make<lazy_tag>(x)>является ленивым значением, равным<x>, и<make<lazy_tag>(f)(x1, ..., xN)>является ленивым вызовом функции, который равен<f(x1, ..., xN)>, когда он<eval>uated.

Note
It is interesting to note that make<lazy_tag>(f)(x1, ..., xN) is equivalent to
ap(make<lazy_tag>(f), lift<lazy_tag>(x1), ..., lift<lazy_tag>(xN))
which in turn is equivalent to make<lazy_tag>(f(x1, ..., xN)), except for the fact that the inner call to f is evaluated lazily.

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() {
BOOST_HANA_CONSTEXPR_LAMBDA auto f = hana::make<hana::lazy_tag>([](auto x) {
return 1 / x;
});
BOOST_HANA_CONSTEXPR_LAMBDA auto g = hana::make_lazy([](auto x) {
return x + 1;
});
BOOST_HANA_CONSTEXPR_CHECK(hana::eval(hana::if_(hana::false_c, f(0), g(0))) == 0 + 1);
}
template<typename implementation_defined >
constexpr auto make_lazy = make<lazy_tag>
related

<make<lazy_tag>>Для удобства.

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() {
BOOST_HANA_CONSTEXPR_LAMBDA auto f = hana::make<hana::lazy_tag>([](auto x) {
return 1 / x;
});
BOOST_HANA_CONSTEXPR_LAMBDA auto g = hana::make_lazy([](auto x) {
return x + 1;
});
BOOST_HANA_CONSTEXPR_CHECK(hana::eval(hana::if_(hana::false_c, f(0), g(0))) == 0 + 1);
}

Статья Boost.Hana: boost::hana::lazy< implementation_defined > Struct Template Reference раздела может быть полезна для разработчиков на c++ и boost.




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 07:25:06/0.0049600601196289/0