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

Boost.Hana: Comonad

Boost , ,

Boost.Hana  1.0.1
Your standard library for metaprogramming
Концепция<Comonad>представляет контекстно-чувствительные вычисления и данные.

Формально понятие Комонада двойственно понятию Монада. Но если ты не математик, тебе все равно, и все в порядке. Таким образом, интуитивно Comonad представляет контекстно-чувствительные значения и вычисления. Сначала Комонады позволяют извлекать контекстно-чувствительные значения из контекста с<extract>. Напротив, монады позволяют обернуть необработанные значения в заданный контекст с<lift>(от Applicative).

Во-вторых, Комонады позволяют применять контекстно-чувствительные значения к функциям, принимающим их, и возвращать результат как контекстно-чувствительное значение с помощью<extend>. Напротив, монады позволяют применять монадическое значение к функции, принимающей нормальное значение и возвращающей монадическое значение, и возвращать результат как монадическое значение (с<chain>).

Наконец, Комонады позволяют обернуть контекстно-чувствительное значение в дополнительный слой контекста, используя<duplicate>, в то время как Монады позволяют взять значение с дополнительным слоем контекста и раздеть его<flatten>.

<lift>,<chain>и<flatten>из Прикладной и Монады имеют подписи

\begin{align*} \mathtt{lift}_M &: T \to M(T) \\ \mathtt{chain} &: M(T) \times (T \to M(U)) \to M(U) \\ \mathtt{flatten} &: M(M(T)) \to M(T) \end{align*}

<extract>,<extend>и<duplicate>из Комонада имеют подписи

\begin{align*} \mathtt{extract} &: W(T) \to T \\ \mathtt{extend} &: W(T) \times (W(T) \to U) \to W(U) \\ \mathtt{duplicate} &: W(T) \to W(W(T)) \end{align*}

Обратите внимание, как «стрелки» переворачиваются. Эта симметрия по существу является тем, что мы подразумеваем под Комонадой, являющейсядвойственнойМонады.

Note
The Typeclassopedia is a nice Haskell-oriented resource for further reading about Comonads.

Minimal complete definition

<extract>и<extend>или<duplicate>, удовлетворяющие нижеприведенным законам. А<Comonad>также должно быть<Functor>.

Laws

Для всех Комонад<w>должны быть соблюдены следующие законы:

Note
There are several equivalent ways of defining Comonads, and this one is just one that was picked arbitrarily for simplicity.

Refined concept

  1. Функтор
    Каждая комонада также должна быть функтором. Поначалу можно подумать, что это должна быть какая-то воображаемая концепция CoFunctor. Однако оказывается, что CoFunctor такой же, какFunctor, следовательно, требование, чтоComonadтакже являетсяFunctor.

Concrete models

<hana::lazy>

Variables

constexpr auto boost::hana::duplicate
 Add an extra layer of comonadic context to a comonadic value.Given a value already in a comonadic context, duplicate wraps this value with an additional layer of comonadic context. This can be seen as the dual operation to flatten from the Monad concept. More...
 
constexpr auto boost::hana::extend
 Comonadic application of a function to a comonadic value.Given a comonadic value and a function accepting a comonadic input, extend returns the result of applying the function to that input inside the comonadic context. More...
 
constexpr auto boost::hana::extract
 Extract a value in a given comonadic context.Given a value inside a comonadic context, extract it from that context, performing whatever effects are mandated by that context. This can be seen as the dual operation to the lift method of the Applicative concept. More...
 

Variable Documentation

constexpr auto boost::hana::duplicate

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

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

Добавьте дополнительный слой комонадического контекста к комонадическому значению. Учитывая значение уже в комонадическом контексте,<duplicate>обертывает это значение дополнительным слоем комонадического контекста. Это можно рассматривать как двойную операцию с концепцией Монады<flatten>.

Signature

При наличии Comonad<W>подпись \(\mathtt{duplicate} : W(T) \to W(W(T)) \.

Parameters
wЗначение обернуть в дополнительный уровень комонадного контекста.

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() {
constexpr auto very_lazy = hana::duplicate(hana::make_lazy(3));
static_assert(hana::extract(hana::extract(very_lazy)) == 3, "");
}
constexpr auto boost::hana::extend

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

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

Комонадическое применение функции к комонадному значению. Учитывая комонадное значение и функцию, принимающую комонадный вход,<extend>возвращает результат применения функции к этому входу внутри комонадного контекста.

Signature

При наличии Comonad<W>и функции типа \(W(T) \to U \), подпись \( \mathtt{extend} : W(T) \times (W(T) \to U) \to W(U) \).

Parameters
wКомонадное значение для вызова функции.
fФункция подписи \( W(T) \to U \) применяется к ее комонадическому аргументу внутри комонадического контекста.

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 <functional>
#include <istream>
#include <sstream>
namespace hana = boost::hana;
template <typename T>
T read_one(std::istream& s) {
T value;
s >> value;
return value;
}
int main() {
std::stringstream s;
s << "1 2 3";
auto from_stream = hana::extend(hana::make_lazy(read_one<int>)(std::ref(s)), [](auto i) {
return hana::eval(i) + 1;
});
}
constexpr auto boost::hana::extract

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

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

Извлеките значение в данном комонадном контексте. Учитывая ценность в комонадическом контексте, извлеките ее из этого контекста, выполняя любые эффекты, предписанные этим контекстом. Это можно рассматривать как двойное действие метода<lift>Прикладной концепции.

Signature

При наличии Comonad<W>подпись \(\mathtt{extract} : W(T) \to T \)

Parameters
wЗначение, которое должно быть извлечено в комонадическом контексте.

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::extract(hana::make_lazy(1)) == 1, "");
static_assert(hana::extract(hana::make_lazy(hana::_ + 1)(3)) == 4, "");
int main() { }

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




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



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


реклама


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

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