WikiSort.ru - Программирование

ПОИСК ПО САЙТУ | о проекте

Функциональный объект (англ. function object), также функтор, функционал и функционоид — распространённая в программировании конструкция, позволяющая использовать объект как функцию. Часто используется как callback, делегат.

Функтором представления называется функтор (англ. functor), описывающий отображение между математическим понятием (множество, функция) и его реализацией на языке программирования (соответственно, множество, функция)[1].

C++

В 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);
}

JavaScript

В JavaScript функторы создаются так:

function functionFunctor(value, fn) {  
    return function(initial) {  
        return function() {  
            return fn(value(initial))  
        }  
    }  
}

function plus1 (value) {
    return value + 1
}

var init = functionFunctor(function(x) {return x * x}, plus1)  
var final = init(2)  
final() ==> 5

C# и VB.NET

В С# и VB.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));
    }
});

или лямбда-выражения:

List<String> list = Arrays.asList( "10", "1", "20", "11", "21", "12" );

Collections.sort( list, (String o1, String o2) ->
		Integer.valueOf( o1 ).compareTo( Integer.valueOf( o2 ) ) );

Haskell

В Haskell функтором называется класс типов[en]*, который декларирует единственный метод «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 = (+1)

numberList = [1, 2, 3, 4, 5]

newNumberList = fmap plusOne numberList

-- newNumberList == [2, 3, 4, 5, 6]

square :: Int -> Int
square = (^2)

-- | 'Set' data type requires "Data.Set" library.
squareAllSetElements :: Set Int -> Set Int
squareAllSetElements = fmap square

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

ML

В диалектах ML (Standard ML, Alice, OCaml) функтор представляет собой функцию над модулями, то есть отображение модулей в модули.

Примечания

Ссылки

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии