Functor (funktionell programmering)
I funktionell programmering är en funktor ett designmönster inspirerat av definitionen från kategoriteorin som gör att man kan tillämpa en funktion på värden inuti en generisk typ utan att ändra strukturen på den generiska typen. I Haskell kan denna idé fångas i en typklass :
klass Funktion f där fmap :: ( a -> b ) -> f a -> f b
med villkor som kallas funktorlagar (där .
står för funktionssammansättning ),
fmap id = id fmap ( g . h ) = ( fmap g ) . ( fmap h )
I Scala kan en egenskap användas:
egenskap Funktioner [ F [ _ ]] { def map [ A , B ]( a : F [ A ])( f : A => B ): F [ B ] }
Funktioner utgör en bas för mer komplexa abstraktioner som Applicative Functor , Monad och Comonad , som alla bygger ovanpå en kanonisk funktionsstruktur. Funktioner är användbara för att modellera funktionella effekter genom värden för parameteriserade datatyper. Modifierbara beräkningar modelleras genom att tillåta en ren funktion att appliceras på värden av den "inre" typen, vilket skapar det nya totala värdet som representerar den modifierade beräkningen (som kanske ännu inte körs).
Exempel
I Haskell är listor ett enkelt exempel på en funktor. Vi kan implementera fmap
as
fmap f [] = [] fmap f ( x : xs ) = ( f x ) : fmap f xs
Ett binärt träd kan på liknande sätt beskrivas som en funktion:
dataträd a = Blad | _ Nod a ( Träd a ) ( Träd a ) instans Funktionsträd där fmap f Leaf = Leaf fmap f ( Nod x l r ) = Nod ( f x ) ( fmap f l ) ( fmap f r ) _
Om vi har ett binärt träd tr :: Träd a
och en funktion f :: a -> b
, kommer funktionen fmap f tr
att tillämpa f
på varje element i tr
. Till exempel, om a
är Int
, kan addering av 1 till varje element i tr
uttryckas som fmap (+ 1) tr
.
Se även
- Funktionär i kategoriteori
- Applikativ funktor , en speciell typ av funkor