Recherche…


Remarques

L'opérateur de composition de fonctions (.) Est défini comme

(.) :: (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) ) ) 

Le type (b -> c) -> (a -> b) -> (a -> c) peut être écrit comme (b -> c) -> (a -> b) -> a -> c car le -> dans les signatures de type "associates" à droite, correspondant à l'application associée à la gauche,

 f g x y z ...    ==    (((f g) x) y) z ...

Donc le "dataflow" est de droite à gauche: x "va" dans g , dont le résultat entre dans f , produisant le résultat final:

(.)       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

....

Syntaxiquement, les éléments suivants sont identiques:

(.) f g x  =  (f . g) x  =  (f .) g x  =  (. g) f x 

ce qui est facile à comprendre comme "les trois règles des sections de l' opérateur ", où "l'argument manquant" va juste dans l'emplacement vide près de l'opérateur:

(.) f g    =  (f . g)    =  (f .) g    =  (. g) f   
--         1             2             3  

Le x , présent des deux côtés de l'équation, peut être omis. Ceci est connu comme eta-contraction. Ainsi, la manière la plus simple d’écrire la définition de la composition de fonction est juste

(f . g) x   =   f (g x)

Cela fait bien sûr référence à "l'argument" x ; chaque fois que nous écrivons simplement (f . g) sans le x il est appelé style sans point.

Composition de droite à gauche

(.) nous permet de composer deux fonctions, alimentant la sortie de l’une en entrée de l’autre:

(f . g) x = f (g x)

Par exemple, si nous voulons équarrir le successeur d’un nombre d’entrée, nous pouvons écrire

((^2) . succ) 1        --    4

Il y a aussi (<<<) qui est un alias à (.) . Alors,

(+ 1) <<< sqrt $ 25    --    6

Composition de gauche à droite

Control.Category définit (>>>) , qui, spécialisé dans les fonctions, est

-- (>>>) :: 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)

Exemple:

sqrt >>> (+ 1) $ 25    --    6.0

Composition avec fonction binaire

La composition régulière fonctionne pour des fonctions unaires. Dans le cas du binaire, on peut définir

(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   

Ainsi, (f .: g) = ((f .) . g) par eta-contraction, et de plus,

(.:) f g    = ((f .) . g)
            = (.) (f .) g
            = (.) ((.) f) g
            = ((.) . (.)) f g

so (.:) = ((.) . (.)) , une définition semi-célèbre.

Exemples:

(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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow