Opérateur de points à Haskell
J'essaie de comprendre ce que fait l'opérateur point dans ce code Haskell:
sumEuler = sum . (map euler) . mkList
Réponse courte
Code équivalent sans points, c'est juste
sumEuler = \x -> sum ((map euler) (mkList x))
ou sans le lambda
sumEuler x = sum ((map euler) (mkList x))
car le point (.) indique la composition de la fonction.
Réponse plus longue
Tout d'abord, simplifions l'application partielle de euler
à map
:
map_euler = map euler
sumEuler = sum . map_euler . mkList
Maintenant, nous n'avons que les points. Qu'est-ce que ces points indiquent?
De la source :
(.) :: (b -> c) -> (a -> b) -> a -> c
(.) f g = \x -> f (g x)
Ainsi (.)
est l' opérateur de composition .
Composer
En mathématiques, nous pourrions écrire la composition des fonctions, f (x) et g (x), c'est-à-dire f (g (x)), comme
(f ∘ g) (x)
qui peut être lu "f composé avec g".
Donc en Haskell, f ∘ g, ou f composé avec g, peut s'écrire:
f . g
La composition est associative, ce qui signifie que f (g (h (x))), écrite avec l'opérateur de composition, peut laisser de côté les parenthèses sans aucune ambiguïté.
Autrement dit, puisque (f ∘ g) ∘ h est équivalent à f ∘ (g ∘ h), nous pouvons simplement écrire f ∘ g ∘ h.
Faire des cercles en arrière
Pour revenir à notre simplification précédente, ceci:
sumEuler = sum . map_euler . mkList
signifie simplement qu'il sumEuler
s'agit d'une composition non appliquée de ces fonctions:
sumEuler = \x -> sum (map_euler (mkList x))