Mis simplement, .
est fonction de la composition, tout comme en mathématiques:
f (g x) = (f . g) x
Dans votre cas, vous êtes la création d'une nouvelle fonction, sumEuler
, qui pourrait également être défini comme ceci:
sumEuler x = sum (map euler (mkList x))
Le style dans votre exemple est appelé "point-gratuit" style -- les arguments de la fonction sont omis. Cela rend le code plus clair dans de nombreux cas. (Il peut être difficile de grok la première fois que vous voyez, mais vous vous habituerez à ça après tout. C'est une commune Haskell idiom.)
Si vous êtes encore confus, il peut aider à relater .
de quelque chose comme un pipe UNIX. Si f
's de sortie devient g
s'entrée, dont la sortie est h
s'entrée, vous auriez du écrire que sur la ligne de commande comme f < x | g | h
. En Haskell, .
fonctionne comme UNIX |
, mais "à l'envers" -- h . g . f $ x
. Je trouve cette notation pour être tout à fait utile quand, par exemple, le traitement d'une liste. À la place de certaines lourd de construction comme map (\x -> x * 2 + 10) [1..10]
, vous pouvez simplement écrire (+10) . (*2) <$> [1..10]
. (Et, si vous voulez seulement d'appliquer cette fonction à une seule valeur; c'est (+10) . (*2) $ 10
. Compatible!)
Le Haskell wiki a un bon article avec plus de détails: http://www.haskell.org/haskellwiki/Pointfree