Haskell Language
Funktionssammansättning
Sök…
Anmärkningar
Operatör av funktionskomposition (.) Definieras som
(.) :: (b -> c) -> (a -> b) -> (a -> c)
(.) f g x = f (g x) -- or, equivalently,
(.) f g = \x -> f (g x)
(.) f = \g -> \x -> f (g x)
(.) = \f -> \g -> \x -> f (g x)
(.) = \f -> (\g -> (\x -> f (g x) ) )
Typen (b -> c) -> (a -> b) -> (a -> c) kan skrivas som (b -> c) -> (a -> b) -> a -> c eftersom -> i typsignaturer "associerade" till höger, motsvarande funktionsapplikationen som associerar till vänster,
f g x y z ... == (((f g) x) y) z ...
Så "dataflödet" är från höger till vänster: x "går" till g , vars resultat går till f , vilket ger slutresultatet:
(.) f g x = r
where r = f (g x)
-- g :: a -> b
-- f :: b -> c
-- x :: a
-- r :: c
(.) f g = q
where q = \x -> f (g x)
-- g :: a -> b
-- f :: b -> c
-- q :: a -> c
....
Syntaktiskt är följande lika:
(.) f g x = (f . g) x = (f .) g x = (. g) f x
vilket är lätt att förstå som "tre regler för operatörssektioner ", där "saknadsargumentet" bara går in i det tomma facket nära operatören:
(.) f g = (f . g) = (f .) g = (. g) f
-- 1 2 3
x , som finns på båda sidor av ekvationen, kan utelämnas. Detta är känt som etakontraktion. Således är det enkla sättet att skriva ner definitionen för funktionskomposition rätt
(f . g) x = f (g x)
Detta hänvisar naturligtvis till "argumentet" x ; när vi skriver bara (f . g) utan x är det känt som punktfri stil.
Höger-till-vänster-komposition
(.) låter oss komponera två funktioner, mata utdata från en som inmatning till den andra:
(f . g) x = f (g x)
Om vi till exempel vill kvadrera efterföljaren till ett inmatningsnummer kan vi skriva
((^2) . succ) 1 -- 4
Det finns också (<<<) som är ett alias till (.) . Så,
(+ 1) <<< sqrt $ 25 -- 6
Vänster till höger komposition
Control.Category definierar (>>>) , som, när den är specialiserad på funktioner, är
-- (>>>) :: Category cat => cat a b -> cat b c -> cat a c
-- (>>>) :: (->) a b -> (->) b c -> (->) a c
-- (>>>) :: (a -> b) -> (b -> c) -> (a -> c)
( f >>> g ) x = g (f x)
Exempel:
sqrt >>> (+ 1) $ 25 -- 6.0
Komposition med binär funktion
Den vanliga kompositionen fungerar för unära funktioner. När det gäller binär kan vi definiera
(f .: g) x y = f (g x y) -- which is also
= f ((g x) y)
= (f . g x) y -- by definition of (.)
= (f .) (g x) y
= ((f .) . g) x y
Således (f .: g) = ((f .) . g) genom etakontraktion, och dessutom,
(.:) f g = ((f .) . g)
= (.) (f .) g
= (.) ((.) f) g
= ((.) . (.)) f g
så (.:) = ((.) . (.)) , en halvberömd definition.
Exempel:
(map (+1) .: filter) even [1..5] -- [3,5]
(length .: filter) even [1..5] -- 2