Концепция MonadPlus представляет Монады с моноидальной структурой.
Intuitively, whereas a Monad can be seen as some kind of container or context, a MonadPlus can be seen as a container or a context that can be concatenated with other container or contexts. Также должен быть элемент идентификации для этой комбинированной операции. Например, тюль является MonadPlus, потому что толщины могут быть конкатенированы, и пустой тюпель будет действовать как личность для конкатации. Чем это отличается от Монада, который также является Моноидом? Ответ заключается в том, что моноидальная структура на MonadPlus должна не зависеть от содержания структуры; она не должна требовать, чтобы содержимое было Monoid для работы.
Хотя последовательности не являются единственной возможной моделью для MonadPlus, используемые здесь названия методов относятся к MonadPlus последовательностей под концентрацией. Несколько полезных функций, обобщающих операции по последовательностям, включены в эту концепцию, например, добавьте, prepend и filter.
Note
This documentation does not go into much details about the nature of the MonadPlus concept. However, there is a nice Haskell-oriented WikiBook going into further details.
Minimal complete definition
наконец и пустое
Laws
Во-первых, MonadPlus должен иметь моноидальную структуру. Поэтому неудивительно, что для любого MonadPlus M мы требуем, чтобы M(T) был действительным моноидом. Тем не менее, мы не утверждаем, что M(T) фактически моделирует концепцию Monoid, предоставленную Ханой. далее для всех объектов a, b, c типа данных M(T),
Во-вторых, MonadPlus также обязан соблюдать следующие законы, которые представляют собой тот факт, что empty() должен быть какой-то поглощающий элемент для операции chain. для всех объектов a типа данных M(T) и функций \( f : T \ to M(U) \),
Append an element to a monadic structure.Given an element x and a monadic structure xs, append returns a new monadic structure which is the result of lifting x into the monadic structure and then combining that (to the right) with xs. In other words,. More...
Combine two monadic structures together.Given two monadic structures, concat combines them together and returns a new monadic structure. The exact definition of concat will depend on the exact model of MonadPlus at hand, but for sequences it corresponds intuitively to simple concatenation. More...
Combine a monadic structure with itself n times.Given a monadic structure xs and a non-negative number n, cycle returns a new monadic structure which is the result of combining xs with itself n times using the concat operation. In other words,. More...
Filter a monadic structure using a custom predicate.Given a monadic structure and a predicate, filter returns a new monadic structure containing only those elements that satisfy the predicate. This is a generalization of the usual filter function for sequences; it works for any MonadPlus. Intuitively, filter is somewhat equivalent to: More...
Inserts a value before each element of a monadic structure.Given a monadic structure xs and a value z called the prefix, prefix returns a new monadic structure. prefix satisfies. More...
Prepend an element to a monadic structure.Given a monadic structure xs and an element x, prepend returns a new monadic structure which is the result of lifting x into the monadic structure and then combining that (to the left) with xs. In other words,. More...
Remove all the elements of a monadic structure that are equal to some value.Given a monadic structure xs and a value, remove returns a new monadic structure equal to xs without all its elements that are equal to the given value. remove is equivalent to remove_if with the equal.to(value) predicate, i.e. More...
Remove all the elements of a monadic structure that satisfy some predicate.Given a monadic structure xs and a unary predicate, remove_if returns a new monadic structure equal to xs without all its elements that satisfy the predicate. This is equivalent to filter with a negated predicate, i.e. More...
Create a monadic structure by combining a lifted value with itself n times.Given a value x, a non-negative IntegralConstantn and the tag of a monadic structure M, replicate creates a new monadic structure which is the result of combining x with itself n times inside the monadic structure. In other words, replicate simply lifts x into the monadic structure, and then combines that with itself n times: More...
Inserts a value after each element of a monadic structure.Given a monadic structure xs and a value z (called the suffix), suffix returns a new monadic structure such that. More...
Приложите элемент к монадической структуре. Учитывая элемент x и монадичную структуру xs, добавьте возвращает новую монадичную структуру, которая является результатом подъема x в монадическую структуру, а затем объединения ее (справа) с xs. Другими словами.
где Xs является тегом xs. Для последовательностей это имеет интуитивное поведение, просто добавляя элемент к концу последовательности, отсюда и название.
Rationale for not calling this push_back
См. обоснование использования prepend вместо push_front.
Signature
Учитывая MonadPlus M, подпись является \(\mathtt{append} : M(T) \times T \to M(T) \.
Parameters
xs
Монадическая структура, которая будет объединена слева от элемента.
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)
Объедините два монадичных сооружения вместе. Учитывая две монадические структуры, concat объединяет их вместе и возвращает новую монадичную структуру. Точное определение concat будет зависеть от точной модели MonadPlus под рукой, но для последовательностей оно интуитивно соответствует простой концентрации.
Также обратите внимание, что сочетание не обязательно должно быть коммутативным. Иными словами, не требуется, чтобы
Объедините монадичную структуру с собой n раз. Учитывая монадичную структуру xs и неотрицательный номер n, цикл возвращает новую монадичную структуру, которая является результатом объединения xs с собой n раз с помощью операции concat. Другими словами.
Если n равен нулю, то возвращается идентификация concat, пустая. В случае последовательностей это сводится к возврату последовательности, содержащей n копии себя; для других моделей это может отличаться.
Signature
Учитывая IntegralConstantC и MonadPlusM, подпись \(\mathrm{cycle}} : M(T) \times C \to M(T) \.
Parameters
xs
Монадическая структура, чтобы объединить с собой определенное количество раз.
n
Неотрицательный IntegralConstant представляет количество раз, чтобы объединить монадичную структуру с собой. Если n равен нулю, цикл возвращает пустое.
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)
Фильтрировать монадическую структуру с помощью пользовательского предика. Учитывая монадическую структуру и предикат, фильтр возвращает новую монадическую структуру, содержащую только те элементы, которые удовлетворяют предикату. Это обобщение обычной функции фильтр для последовательностей; она работает для любого MonadPlus. Интуитивно, фильтр несколько эквивалентен:
Другими словами, мы в основном превращаем монадичную структуру, содержащую [x1, ..., xn] в монадическую структуру, содержащую
[
pred(x1) ? [x1] : [],
pred(x2) ? [x2] : [],
...
pred(xn) ? [xn] : []
]
и мы затем раздуваем это.
Signature
Учитывая MonadPlusM и IntegralConstantBool, владеющий значением типа bool, подпись \(\mathtt{filter}: M(T) \times (T \to \mathtt{Bool}) \ to M(T) \.
Parameters
xs
Монадическая структура для фильтрации.
pred
Функция называется pred(x) для каждого элемента x в монадической структуре и возвращает, должен ли этот элемент быть kept в соответствующей структуре. В текущей версии библиотеки предикат должен вернуть IntegralConstant, удерживающее значение конвертируемое в bool.
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)
Вставляет значение перед каждым элементом монадической структуры. Учитывая монадичную структуру xs и значение z, называемое префиксом, префикс возвращает новую монадическую структуру. префикс удовлетворяет.
Для последовательностей это просто соответствует вставке префикса перед каждым элементом последовательности. Например, при наличии последовательности [x1, ..., xn], префикс вернется
[z, x1, z, x2, ..., z, xn]
Как объяснялось выше, это может быть обобщено для других моделей MonadPlus с различными уровнями интереса.
Signature
Учитывая MonadPlus M, подпись является \(\mathrm{prefix}: M(T) \times T \to M(T) \.
Parameters
xs
Монадическая структура.
pref
Значение (префикс) для вставки перед каждым элементом монадической структуры.
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)
Предохраняйте элемент к монадической структуре. Учитывая монадичную структуру xs и элемент x, prepend возвращает новую монадичную структуру, которая является результатом подъема x в монадическую структуру, а затем объединения ее (налево) с xs. Другими словами.
Для последовательностей это имеет интуитивное поведение, просто предваряя элемент к началу последовательности, отсюда и название.
Rationale for not calling this push_front
В то время как push_front является де-факто именем, используемым в стандартной библиотеке, он также настоятельно предлагает мутацию основной последовательности, что здесь не так. Автор также считает, что push_front слишком сильно предлагает единственную интерпретацию размещения элемента в передней части последовательности, в то время как prepend немного больше нюансов и носит его название лучше для, например, hana::Option.
Signature
Учитывая MonadPlus M, подпись является \( \mathtt{prepend} : M(T) \times T \to M(T)\).
Parameters
xs
Монадическая структура, которая будет объединена справа от элемента.
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)
Return the compile-time value associated to a constant.This function returns the value associated to ...
Definition: value.hpp:54
Удалить все элементы монадической структуры, которые равны некоторому значению. Учитывая монадичную структуру xs и значение , remove возвращает новую монадичную структуру, равную xs без всех его элементов, равных данным значение. remove эквивалентно remove_if с equal.to( value) predicate, i.e.
Учитывая MonadPlus M и значение типа T, подпись \( \mathrm{remove} : M(T) \times T \to M(T) \
Parameters
xs
Монадическая структура для удаления некоторых элементов.
value
Значение, которое сравнивается с каждым элементом x структуры. Элементы структуры, равные этому значению, удаляются из структуры. Это требует, чтобы каждый элемент был сопоставим с значением . Кроме того, в текущей версии библиотеки сравнение value с любым элементом структуры должно привести к логическому времени компиляции.
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)
Удалить все элементы монадической структуры, которые удовлетворяют некоторым предикатам. При наличии монадической структуры xs и неарочного предика remove_if возвращает новую монадичную структуру, равную xs, без всех ее элементов, удовлетворяющих предикату. Это эквивалентно фильтру с отложенным предикатом, т.е.
Учитывая MonadPlus M и предикат типа \( T \to Bool \) для некоторого компиляционного времени Logical Bool, подпись \( \mathrm{remove\_if} : M(T) \time (T \to Bool) \to M(T) \
Parameters
xs
Монадическая структура для удаления некоторых элементов.
predicate
Неарочный предикат, называемый predicate(x), где x является элементом структуры, и возвращается ли x должно быть удалено из структуры. В текущей версии библиотеки predicate должен вернуть логическое время компиляции.
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)
Создайте монадичную структуру, сочетая поднятое значение с собой n раз. Учитывая значение x, неотрицательное IntegralConstantn и тег монадической структуры M, replicate создает новую монадичную структуру, которая является результатом объединения x с собой n раз внутри монадической структуры. Другими словами, replicate просто lifts x в монадическую структуру, а затем сочетает это с собой n раз:
Если n равен нулю, то возвращается идентификация операции concat. В случае последовательностей это соответствует созданию новой последовательности, удерживающей n копии x.
Signature
Учитывая IntegralConstantC и MonadPlus M, подпись \(\mathtt{replicate}_M: T \times C \to M(T) \).
Template Parameters
M
Тег возвращенной монадической структуры. Это должна быть модель концепции MonadPlus.
Parameters
x
Значение, чтобы поднять в монадичную структуру, а затем объединить с собой.
n
Неотрицательный IntegralConstant представляет количество раз, чтобы объединить lift(x) с собой. Если n == 0, replicate возвращает empty().
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)
Вставляет значение после каждого элемента монадической структуры. Учитывая монадичную структуру xs и значение z (называемый суффиксом), suffix возвращает новую монадичную структуру, такую, что.
Для последовательностей это просто соответствует вставке суффикса после каждого элемента последовательности. Например, при наличии последовательности [x1, ..., xn], suffix вернется
[x1, z, x2, z, ..., xn, z]
Как объяснялось выше, это может быть обобщено для других моделей MonadPlus с различными уровнями интереса.
Signature
Учитывая MonadPlus M, подпись является \( \mathtt{suffix} : M(T) \times T \to M(T)\).
Parameters
xs
Монадическая структура.
sfx
Значение (суффикс) для вставки после каждого элемента монадической структуры.
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: MonadPlus раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.