Концепция Functor представляет типы, которые могут быть отображены.
Intuitively, a Functor - это своего рода коробка, которая может содержать общие данные и отображать функцию над этими данными для создания новой, преобразованной коробки. Поскольку мы заинтересованы только в отображении функции над содержанием черного ящика, единственное реальное требование для того, чтобы быть фанктором, состоит в том, чтобы предоставить функцию, которая может сделать картирование, а также пару гарантий того, что картирование хорошо себя вести. Эти требования четко изложены в законах ниже. Модель, захваченная Functor, очень общая, что делает ее широко полезной. Многие объекты могут быть сделаны Функтор так или иначе, наиболее очевидным примером являются последовательности с обычным отображением функции на каждом элементе. Хотя эта документация не будет вдаваться в гораздо более подробную информацию о природе фанкторов, Typeclassopedia является хорошим ресурсом, ориентированным на Haskell для такой информации.
Functors - это параметрические типы данных, которые параметризируются по типу данных содержащихся в них объектов. Как и везде в Хане, эта параметричность находится только на уровне документации и не выполняется.
В этой библиотеке функция картирования называется transform после алгоритма std::transform, но другие языки программирования дали ему разные имена (обычно map).
Note
The word functor comes from functional programming, where the concept has been used for a while, notably in the Haskell programming language. Haskell people borrowed the term from category theory, which, broadly speaking, is a field of mathematics dealing with abstract structures and transformations between those structures.
В первой строке говорится, что отображение функции идентификации не должно делать ничего, что не позволяет фанктору делать что-то неприятное за кулисами. Вторая линия гласит, что отображение состава двух функций совпадает с отображением первой функции, а затем второй по результату. В то время как обычные законы фанктора обычно ограничиваются вышеуказанным, эта библиотека включает другие методы удобства, и они должны удовлетворять следующим уравнениям. Let xs be a Functor with tag F(A), \( f : A \to A \), \( \mathrm{pred} : A \to \mathrm{Bool} \) для некоторых LogicalBool, и oldval, newval, value объектов тега A. Тогда,
Картографию между двумя фанкторами, которая также сохраняет законы фанктора, называют естественной трансформацией (термин исходит из теории категорий). Естественная трансформация - это функция f от фанктора F до фанктора G, так что для каждой другой функции g с соответствующей подписью и для каждого объекта xs тега F(X),
Существует несколько примеров таких трансформаций, таких как to<tuple_tag>, когда применяется к опционному значению. Действительно, для любой функции g и хана:: Опционноopt,
Конечно, естественные преобразования не ограничиваются функциями to<...>. Однако обратите внимание, что любая конверсионная функция между Functors должна быть естественной для поведения преобразования быть интуитивной.
Apply a function on all the elements of a structure satisfying a predicate.Given a Functor, a predicate pred and a function f, adjust_if will adjust the elements of the Functor that satisfy the predicate with the function f. In other words, adjust_if will return a new Functor equal to the original one, except that the elements satisfying the predicate will be transformed with the given function. Elements for which the predicate is not satisfied are left untouched, and they are kept as-is in the resulting Functor. More...
Применяйте функцию на все элементы структуры, удовлетворяющие предикату. Учитывая Functor, предикат pred и функцию f, adjust_if будет корректировать элементы Functor, которые удовлетворяют предика с функцией f. Другими словами, adjust_if вернет новый Functor, равный оригинальному, за исключением того, что элементы, удовлетворяющие предикату, будут преобразованы с заданной функцией. Элементы, для которых предикат не удовлетворяется, остаются нетронутыми, и они хранятся как-это в результате Functor.
Статья Boost.Hana: Functor раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.