Для установки нажмите кнопочку Установить расширение. И это всё.

Исходный код расширения WIKI 2 регулярно проверяется специалистами Mozilla Foundation, Google и Apple. Вы также можете это сделать в любой момент.

4,5
Келли Слэйтон
Мои поздравления с отличным проектом... что за великолепная идея!
Александр Григорьевский
Я использую WIKI 2 каждый день
и почти забыл как выглядит оригинальная Википедия.
Статистика
На русском, статей
Улучшено за 24 ч.
Добавлено за 24 ч.
Альтернативы
Недавние
Show all languages
Что мы делаем. Каждая страница проходит через несколько сотен совершенствующих техник. Совершенно та же Википедия. Только лучше.
.
Лео
Ньютон
Яркие
Мягкие

Функциональный объект

Из Википедии — свободной энциклопедии

Функциональный объект (англ. 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 функтором называется класс типов, который декларирует единственный метод «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

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

PHP

В PHP существует магический метод __invoke , который вызывается когда скрипт пытается выполнить объект как функцию:

class Functor {
    public function __invoke(int $a, int $b): bool
    {
        return $a < $b;
    }
}

$arr = [1, 5, 2, 8, 9, 0, 3];

usort($arr, new Functor());

ML

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

Примечания

Ссылки

Эта страница в последний раз была отредактирована 29 декабря 2020 в 11:25.
Как только страница обновилась в Википедии она обновляется в Вики 2.
Обычно почти сразу, изредка в течении часа.
Основа этой страницы находится в Википедии. Текст доступен по лицензии CC BY-SA 3.0 Unported License. Нетекстовые медиаданные доступны под собственными лицензиями. Wikipedia® — зарегистрированный товарный знак организации Wikimedia Foundation, Inc. WIKI 2 является независимой компанией и не аффилирована с Фондом Викимедиа (Wikimedia Foundation).