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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow