Dans le livre "The Craft of Function Programming", le symbole '>.>' relie les fonctions entre elles, dans le sens inverse de '.'. Mais lorsque je l'ai implémenté avec ghci, l'erreur '>.>' est affichée hors de portée. Pourquoi ? S'agit-il d'une ancienne notation qui n'est plus utilisée ?
Réponses
Trop de publicités?C'est probablement juste une fonction définie par le livre (je n'ai pas lu le livre). AFAIK, >.>
n'est utilisé nulle part. Vous pourriez le définir vous-même :
(>.>) = flip (.)
La notation de facto de ceci semble être (#)
.
Puisque les fonctions sont flèches "Contrôle.Catégorie" vous pouvez également utiliser >>>
par exemple
Prelude Control.Category> ((*2) . (+1)) 4
10
Prelude Control.Category> ((*2) <<< (+1)) 4
10
Prelude Control.Category> ((*2) >>> (+1)) 4
9
Prelude Control.Category> ((+1) >>> (*2)) 4
10
(>.>)
ne semble pas être défini dans les bibliothèques standard. Cependant, il existe (>>>)
sur Control.Category
qui se comporte de la même manière :
Prelude> :m + Control.Category
Prelude Control.Category> :i (>>>)
(>>>) :: Category cat => cat a b -> cat b c -> cat a c
-- Defined in Control.Category
infixr 1 >>>
Prelude Control.Category> let f = (* 2) >>> (+ 3)
Prelude Control.Category> f 5
13
Notez que vous pouvez utiliser Hoogle pour comprendre ces choses.
En outre, vous pouvez bien sûr toujours définir vous-même un tel opérateur :
(>.>) :: (a -> b) -> (b -> c) -> (a -> c)
f >.> g = g . f
Ensuite, vous pourrez écrire :
Main*> ((* 2) >.> (+ 3)) 5
13