- Функтор (программирование)
-
Функциональный объект (англ. function object), так же функтор, функционал и функционоид — распространённая в программировании конструкция, позволяющая использовать объект как функцию. Часто используется как callback, делегат, либо как замена лямбда-выражениям в нефункциональных языках программирования.
Функтором представления называется функтор (англ. functor), описывающий отображение между математическим понятием (множество, функция) и его реализацией на языке программирования (соответственно, множество, функция)[1].
Содержание
C
В C для создания функционального объекта используются указатели на функцию:
/* callback-функция */ int compare_function(int A, int B) { return A < B; } /* объявление функции сортировки */ void sort_ints(int* begin_items, int num_items, int (*cmpfunc)(int, int)); int main(void) { int items[] = {4, 3, 1, 2}; sort_ints(items, sizeof(items)/sizeof(int), compare_function); return 0; }
С++
В C++ функциональный объект создаётся с помощью класса, у которого перегружен operator():
class compare_class { public: bool operator()(int A, int B) { return (A < B); } }; // объявление функции сортировки template <class ComparisonFunctor> void sort_ints(int* begin_items, int num_items, ComparisonFunctor c); int main() { int items[] = {4, 3, 1, 2}; compare_class functor; sort_ints(items, sizeof(items)/sizeof(int), functor); }
С# и VB.NET
В C# и Visual Basic .NET для программирования функторов используются делегаты.
Java
Поскольку в Java функции не являются объектами первого класса, функциональные объекты представляют собой интерфейс с единственным методом, как правило, реализованный в виде безымянного вложенного класса):
List<String> list = Arrays.asList("10", "1", "20", "11", "21", "12"); Collections.sort(list, new Comparator<String>() { public int compare(String o1, String o2) { return Integer.valueOf(o1).compareTo(Integer.valueOf(o2)); } });
Haskell
В Haskell функтором называется класс типов (в общеизвестной терминологии — интерфейс), который декларирует единственный метод «fmap». Интуитивно, «fmap» применяет функцию a -> b к значению типа f a, чтобы получить значение типа f b. С другой стороны, можно рассматривать «fmap» как функцию высшего порядка, преобразующую «простую» функцию a -> b в «составную» функцию f a -> f b. Важно отметить, что структура значения типа f после применения «fmap» должна оставаться неизменной.
class Functor f where fmap :: (a -> b) -> f a -> f b
Тривиальные примеры использования:
plusOne x = x + 1 numberList = [1, 2, 3, 4, 5] newNumberList = fmap plusOne numberList -- newNumberList == [2, 3, 4, 5, 6] square :: Int -> Int square x = x * x -- | 'Set' data type requires "Data.Set" library. squareAllSetElements :: Set Int -> Set Int squareAllSetElements set = fmap square set
Функтор может быть определён практически для любого параметрически полиморфного типа.
Примечания
Ссылки
- Функторы в STL Programmer’s Guide (англ.)
- Thomas Becker STL & Generic Programming: STL Function Objects and Their Adaptors (англ.) // Dr. Dobb’s Journal. — 2002.
- Herb Sutter Generalized Function Pointers (англ.) // Dr. Dobb’s Journal. — 2003.
- Описание функторов в Portland Pattern Repository (англ.)
- Толковый словарь по вычислительным системам / Под ред. В. Иллингуорта и др.. — М.: Машиностроение, 1990. — 560 с. — ISBN 5-217-00617-X
Для улучшения этой статьи желательно?: - Проставив сноски, внести более точные указания на источники.
Категория:- Концепции языков программирования
Wikimedia Foundation. 2010.