Функтор (программирование)

Функтор (программирование)

Функциональный объект (англ. 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

Функтор может быть определён практически для любого параметрически полиморфного типа.

Примечания

Ссылки



Wikimedia Foundation. 2010.

Игры ⚽ Поможем сделать НИР

Полезное


Смотреть что такое "Функтор (программирование)" в других словарях:

  • Функтор (математика) — У этого термина в программировании есть другое значение: «Функтор (программирование)». Все значения этого слова здесь. Функтор  это особый тип отображений между категориями, сохраняющих структуру. Их можно рассматривать как морфизмы в… …   Википедия

  • Функтор — В Викисловаре есть статья «функтор» Функтор: Функтор (программирование)  объект, который можно использовать как функцию; на С++  класс, имеющий в себе операцию перегрузки круглых скобок(operator() (…)). Функтор (математика)  тип… …   Википедия

  • Делегат (программирование) — Делегат (англ. delegates)  структура данных, указывающая на статические методы или методы экземпляра класса в .NET Framework[1][2][3][4]. Делегаты используются, в …   Википедия

  • Функциональное программирование на Питоне — Функциональное программирование является одной из парадигм, поддерживаемых языком программирования Python. Основными предпосылками для полноценного функционального программирования в Python являются: функции высших порядков, развитые средства… …   Википедия

  • Функциональное программирование на Python — Функциональное программирование является одной из парадигм, поддерживаемых языком программирования Python. Основными предпосылками для полноценного функционального программирования в Python являются: функции высших порядков, развитые средства… …   Википедия

  • Примеры программ на языке Python — Содержание 1 Примеры программ на языке программирования Python. 1.1 …   Википедия

  • Список статей по логике —   Это служебный список статей, созданный для координации работ по развитию темы.   Данное предупреждение не ус …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»