Ett funktionsobjekt ( eng. function object ), även functor , functional och funktsionoid - en vanlig konstruktion inom programmering som låter dig använda ett objekt som funktion . Används ofta som återuppringning , delegering .
En representationsfunktion är en funktion som beskriver en mappning mellan ett matematiskt koncept ( mängd , funktion ) och dess implementering i ett programmeringsspråk (respektive mängd , funktion ) [1] .
I C++ skapas ett funktionsobjekt med en klass som har operator() överbelastad :
class compare_class { offentliga : bool operator ()( int A , int B ) { return ( A < B ); } }; // sorteringsfunktionsdeklarationsmall < class ComparisonFunctor > void sort_ints ( int * begin_items , int num_items , ComparisonFunctor c ) ; int main () { int objekt [] = { 4 , 3 , 1 , 2 }; compare_class functor ; sort_ints ( objekt , storlek på ( objekt ) / storlek på ( int ), funktor ); }I JavaScript är en funktion ett objekt:
const acc = funktion ( lägg till ) { acc . värde += addera ; }; enl . värde = 0 ; acc ( 2 ); konsol . log ( tilll . värde ); // 2 acc ( 6 ); konsol . log ( tilll . värde ); // åttaC # och VB.NET använder delegater för att programmera funktioner .
Eftersom funktioner inte är förstklassiga objekt i Java , är en funktor ett objekt som implementerar ett gränssnitt , ofta som en icke namngiven kapslad klass :
List < String > list = Arrayer . asList ( "10" , "1" , "20" , "11" , "21" , "12" ); samlingar . sort ( list , new Comparator < String > () { public int compare ( String o1 , String o2 ) { return Integer . valueOf ( o1 ). compareTo ( Integer . valueOf ( o2 )); } });eller lambda-uttryck :
List < String > list = Arrayer . asList ( "10" , "1" , "20" , "11" , "21" , "12" ); samlingar . sort ( list , ( String o1 , String o2 ) -> Integer . valueOf ( o1 ). compareTo ( Integer . valueOf ( o2 ) ) );I Haskell är en funktor en typklass som deklarerar en enda "fmap"-metod. Intuitivt tillämpar "fmap" funktionen a -> b på ett värde av typen fa för att få ett värde av typen fb . Å andra sidan kan man tänka på "fmap" som en högre ordningsfunktion som omvandlar en "enkel" funktion a -> b till en "sammansatt" funktion fa -> fb . Det är viktigt att notera att strukturen för ett värde av typ f efter applicering av "fmap" måste förbli oförändrad.
klass Funktion f där fmap :: ( a -> b ) -> f a -> f bTriviala användningsfall:
plusEtt = ( + 1 ) nummerlista = [ 1 , 2 , 3 , 4 , 5 ] newNumberList = fmap plusOne numberList -- newNumberList == [2, 3, 4, 5, 6] kvadrat :: Int -> Int kvadrat = ( ^ 2 ) -- | "Set"-datatypen kräver "Data.Set"-bibliotek. squareAllSetElements :: Set Int -> Set Int squareAllSetElements = fmap squareEn funktion kan definieras för nästan vilken parametriskt polymorf typ som helst .
PHP har en magisk metod __invokesom kallas när ett skript försöker köra ett objekt som en funktion:
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 ());I ML- dialekter ( Standard ML , Alice , OCaml ) är en funktor en funktion över moduler, det vill säga en mappning från moduler till moduler .