Funkční objekt ( angl. function object ), také funktor , funkcionál a funktsionoid - běžná konstrukce v programování , která umožňuje použít objekt jako funkci . Často se používá jako zpětné volání , delegát .
Funktor reprezentace je funktor , který popisuje zobrazení mezi matematickým pojmem ( množina , funkce ) a jeho implementací v programovacím jazyce (respektive množina , funkce ) [1] .
V C++ je funkční objekt vytvořen pomocí třídy, která má přetíženou operátor() :
třída porovnat_třída { veřejnost : bool operátor ()( int A , int B ) { návrat ( A < B ); } }; // šablona deklarace funkce řazení < class ComparisonFunctor > void sort_ints ( int * begin_items , int num_items , ComparisonFunctor c ); int main () { int položky [] = { 4 , 3 , 1 , 2 }; funktor porovnat_třídu ; sort_ints ( položky , sizeof ( položky ) / sizeof ( int ), funktor ); }V JavaScriptu je funkce objekt:
const acc = function ( add ) { acc . hodnota += přidat ; }; přísl . hodnota = 0 ; acc ( 2 ); konzole . log ( přísl . hodnota ); // 2 acc ( 6 ); konzole . log ( přísl . hodnota ); // osmC # a VB.NET používají delegáty k programování funktorů .
Protože funkce nejsou v Javě prvotřídními objekty , functor je objekt, který implementuje rozhraní , často jako nepojmenovaná vnořená třída :
Seznam < String > seznam = Pole . asList ( "10" , "1" , "20" , "11" , "21" , "12" ); sbírky . sort ( list , new Comparator < String > () { public int Compare ( String o1 , String o2 ) { return Integer . valueOf ( o1 ). CompareTo ( Integer . valueOf ( o2 )); } });nebo lambda výrazy :
Seznam < String > seznam = Pole . asList ( "10" , "1" , "20" , "11" , "21" , "12" ); sbírky . sort ( list , ( String o1 , String o2 ) -> Integer . valueOf ( o1 ). CompareTo ( Integer . valueOf ( o2 ) ) );V Haskell je funktor typová třída , která deklaruje jednu metodu "fmap". Intuitivně "fmap" aplikuje funkci a -> b na hodnotu typu fa a získá hodnotu typu fb . Na druhou stranu si lze "fmap" představit jako funkci vyššího řádu , která transformuje "jednoduchou" funkci a -> b na "složenou" funkci fa -> fb . Je důležité si uvědomit, že struktura hodnoty typu f po použití "fmap" musí zůstat nezměněna.
třída Funktor f kde fmap :: ( a -> b ) -> f a -> f bTriviální případy použití:
plus1 = ( + 1 ) seznam čísel = [ 1 , 2 , 3 , 4 , 5 ] newNumberList = fmap plusJedno číselný seznam -- newNumberList == [2, 3, 4, 5, 6] square :: Int -> Int square = ( ^ 2 ) -- | Datový typ 'Set' vyžaduje knihovnu "Data.Set". squareAllSetElements :: Set Int -> Set Int squareAllSetElements = fmap squareFunktor lze definovat pro téměř jakýkoli parametricky polymorfní typ .
PHP má magickou metodu __invoke, která se volá, když se skript pokouší spustit objekt jako funkci:
class Functor { public function __invoke ( int $a , int $b ) : bool { return $a < $b ; } } $arr = [ 1 , 5 , 2 , 8 , 9 , 0 , 3 ]; usort ( $arr , nový funktor ());V dialektech ML ( Standard ML , Alice , OCaml ) je funktor funkcí nad moduly, tedy mapování z modulů na moduly .