Funkční objekt

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 7. října 2020; kontroly vyžadují 4 úpravy .

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] .

C++

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

JavaScript

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 ); // osm

C# a VB.NET

C # a VB.NET používají delegáty k programování funktorů .

Java

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

Haskell

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 b

Triviá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 square

Funktor lze definovat pro téměř jakýkoli parametricky polymorfní typ .

PHP

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 ());

ML

V dialektech ML ( Standard ML , Alice , OCaml ) je funktor funkcí nad moduly, tedy mapování z modulů na moduly .

Poznámky

  1. Explanatory Dictionary of Computing Systems, 1990 .

Odkazy