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