Funkcióobjektum ( eng. function object ), funktor , funkcionális és funktsionoid is – egy gyakori konstrukció a programozásban , amely lehetővé teszi egy objektum funkcióként történő használatát . Gyakran használják visszahívásként , delegáltként .
A reprezentációs funktor egy olyan függvény , amely egy matematikai fogalom ( halmaz , függvény ) és annak programnyelvi megvalósítása (illetve halmaz , függvény ) közötti leképezést írja le [1] .
A C++ nyelvben egy függvényobjektum egy olyan osztály használatával jön létre, amely túlterhelt operátort () tartalmaz :
osztály összehasonlítás_osztály { nyilvános : bool operátor ()( int A , int B ) { vissza ( A < B ); } }; // rendezési függvény deklarációs sablon < class ComparisonFunctor > void sort_ints ( int * begin_items , int num_items , ComparisonFunctor c ); int main () { int tételek [] = { 4 , 3 , 1 , 2 }; osztály összehasonlítási függvénye ; sort_ints ( items , sizeof ( items ) / sizeof ( int ), functor ); }A JavaScriptben a függvény egy objektum:
const acc = function ( add ) { acc . érték += hozzáadás ; }; acc . érték = 0 ; acc ( 2 ); konzol . log ( acc . value ); 2 acc ( 6 ); konzol . log ( acc . value ); // nyolcA C # és a VB.NET delegátusokat használ a programfunkciókhoz .
Mivel a függvények nem első osztályú objektumok a Java -ban , a funktor egy olyan objektum, amely interfészt valósít meg , gyakran névtelen beágyazott osztályként :
Lista < Karakterlánc > list = Tömbök . asList ( " 10 " , " 1 " , " 20 " , " 11 " , " 21 " , " 12 " ); gyűjtemények . sort ( lista , új Összehasonlító < String > () { public int összehasonlítás ( String o1 , String o2 ) { return Integer . valueOf ( o1 ). ÖsszehasonlítTo ( Integer . valueOf ( o2 )); } });vagy lambda kifejezések :
Lista < Karakterlánc > list = Tömbök . asList ( " 10 " , " 1 " , " 20 " , " 11 " , " 21 " , " 12 " ); gyűjtemények . sort ( lista , ( String o1 , String o2 ) -> Integer . valueOf ( o1 ). Összehasonlít To ( Integer . valueOf ( o2 ) ) );A Haskellben a funktor egy típusosztály, amely egyetlen "fmap" metódust deklarál. Intuitív módon az "fmap" az a -> b függvényt fa típusú értékre alkalmazza, hogy fb típusú értéket kapjon . Másrészt az "fmap" egy magasabb rendű függvénynek tekinthető , amely az "egyszerű" a -> b függvényt "összetett" fa -> fb függvényté alakítja . Fontos megjegyezni, hogy az f típusú érték szerkezetének az "fmap" alkalmazása után változatlannak kell maradnia.
osztály Funktor f ahol fmap :: ( a -> b ) -> f a -> f bTriviális használati esetek:
pluszegy = ( +1 ) _ numberList = [ 1 , 2 , 3 , 4 , 5 ] newNumberList = fmap plusOne numberList -- newNumberList == [2, 3, 4, 5, 6] négyzet :: Int -> Int négyzet = ( ^ 2 ) -- | A „Set” adattípushoz „Data.Set” könyvtár szükséges. squareAllSetElements :: Int beállítása -> Int beállítása squareAllSetElements = fmap squareFunktor definiálható szinte bármilyen parametrikusan polimorf típushoz .
A PHP -nek van egy varázslatos metódusa __invoke, amely akkor hívódik meg, amikor egy szkript függvényként próbál végrehajtani egy objektumot:
class Funktor { public function __invoke ( int $a , int $b ) : bool { return $a < $b ; } } $arr = [ 1 , 5 , 2 , 8 , 9 , 0 , 3 ]; usort ( $arr , új függvény ());Az ML dialektusokban ( Standard ML , Alice , OCaml ) a funktor egy modulok feletti függvény, azaz egy modulról modulra való leképezés .