Haskell Language
Skład funkcji
Szukaj…
Uwagi
Operator kompozycji funkcji (.)
Jest zdefiniowany jako
(.) :: (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) ) )
Typ (b -> c) -> (a -> b) -> (a -> c)
można zapisać jako (b -> c) -> (a -> b) -> a -> c
ponieważ ->
w podpisach typu „kojarzy się” po prawej stronie, odpowiadając aplikacji funkcji kojarzącej się po lewej stronie,
f g x y z ... == (((f g) x) y) z ...
Zatem „przepływ danych” odbywa się od prawej do lewej: x
„idzie” do g
, którego wynik przechodzi do f
, co daje wynik końcowy:
(.) 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
....
Składniowo następujące są takie same:
(.) f g x = (f . g) x = (f .) g x = (. g) f x
który łatwo zrozumieć jako „trzy reguły sekcji operatora ”, gdzie „brakujący argument” po prostu trafia do pustego miejsca w pobliżu operatora:
(.) f g = (f . g) = (f .) g = (. g) f
-- 1 2 3
x
, występujące po obu stronach równania, można pominąć. Jest to znane jako eta-skurcz. Zatem prosty sposób na zapisanie definicji składu funkcji jest po prostu
(f . g) x = f (g x)
Odnosi się to oczywiście do „argumentu” x
; gdy napisać odległości (f . g)
bez x
znany jest jako punkt-free style.
Kompozycja od prawej do lewej
(.)
pozwala nam skomponować dwie funkcje, zasilając jedną z nich jako dane wejściowe do drugiej:
(f . g) x = f (g x)
Na przykład, jeśli chcemy wyrównać następcę liczby wejściowej, możemy napisać
((^2) . succ) 1 -- 4
Istnieje również (<<<)
który jest aliasem dla (.)
. Więc,
(+ 1) <<< sqrt $ 25 -- 6
Kompozycja od lewej do prawej
Control.Category
definiuje (>>>)
, który jest specjalizowany w funkcjach
-- (>>>) :: 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)
Przykład:
sqrt >>> (+ 1) $ 25 -- 6.0
Kompozycja z funkcją binarną
Kompozycja zwykła działa dla funkcji jednoargumentowych. W przypadku pliku binarnego możemy zdefiniować
(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
Zatem (f .: g) = ((f .) . g)
przez eta-skurcz, a ponadto,
(.:) f g = ((f .) . g)
= (.) (f .) g
= (.) ((.) f) g
= ((.) . (.)) f g
więc (.:) = ((.) . (.))
, półsławna definicja.
Przykłady:
(map (+1) .: filter) even [1..5] -- [3,5]
(length .: filter) even [1..5] -- 2