Концепция<Comonad>представляет контекстно-чувствительные вычисления и данные.
Формально понятие Комонада двойственно понятию Монада. Но если ты не математик, тебе все равно, и все в порядке. Таким образом, интуитивно Comonad представляет контекстно-чувствительные значения и вычисления. Сначала Комонады позволяют извлекать контекстно-чувствительные значения из контекста с<extract>. Напротив, монады позволяют обернуть необработанные значения в заданный контекст с<lift>(от Applicative).
Во-вторых, Комонады позволяют применять контекстно-чувствительные значения к функциям, принимающим их, и возвращать результат как контекстно-чувствительное значение с помощью<extend>. Напротив, монады позволяют применять монадическое значение к функции, принимающей нормальное значение и возвращающей монадическое значение, и возвращать результат как монадическое значение (с<chain>).
Наконец, Комонады позволяют обернуть контекстно-чувствительное значение в дополнительный слой контекста, используя<duplicate>, в то время как Монады позволяют взять значение с дополнительным слоем контекста и раздеть его<flatten>.
<lift>,<chain>и<flatten>из Прикладной и Монады имеют подписи
Обратите внимание, как «стрелки» переворачиваются. Эта симметрия по существу является тем, что мы подразумеваем под Комонадой, являющейсядвойственнойМонады.
Note
The Typeclassopedia is a nice Haskell-oriented resource for further reading about Comonads.
Minimal complete definition
<extract>и<extend>или<duplicate>, удовлетворяющие нижеприведенным законам. А<Comonad>также должно быть<Functor>.
Laws
Для всех Комонад<w>должны быть соблюдены следующие законы:
There are several equivalent ways of defining Comonads, and this one is just one that was picked arbitrarily for simplicity.
Refined concept
Функтор Каждая комонада также должна быть функтором. Поначалу можно подумать, что это должна быть какая-то воображаемая концепция CoFunctor. Однако оказывается, что CoFunctor такой же, какFunctor, следовательно, требование, чтоComonadтакже являетсяFunctor.
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...
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...
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...
Добавьте дополнительный слой комонадического контекста к комонадическому значению. Учитывая значение уже в комонадическом контексте,<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)
Комонадическое применение функции к комонадному значению. Учитывая комонадное значение и функцию, принимающую комонадный вход,<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)
Извлеките значение в данном комонадном контексте. Учитывая ценность в комонадическом контексте, извлеките ее из этого контекста, выполняя любые эффекты, предписанные этим контекстом. Это можно рассматривать как двойное действие метода<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)
Статья Boost.Hana: Comonad раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.