La composition de fonction est un moyen d'enchaîner deux fonctions ou plus. Il est souvent assimilé à la tuyauterie en coquille. Par exemple, dans un style shell Unix, vous pouvez écrire quelque chose comme
cat foo.txt | sort -n | less
Cela va cat
, alimente sa sortie à sort
, et alimente la sortie de celui less
. Strictement, cela ressemble à l'opérateur $
de Haskell. Vous pourriez écrire quelque chose comme
sum $ sort $ filter (> 0) $ my_list
Notez que, contrairement à l'exemple du shell, cela se lit de droite à gauche. Donc, nous commençons par my_list
en entrée, puis nous exécutons filter
dessus, puis nous sort
, puis nous calculons le sum
.
L'opérateur de composition de fonction, .
, effectue une opération similaire. L'exemple ci-dessus produit un numéro; l'exemple ci-dessous produit une fonction :
sum . sort . filter (> 0)
Notez que nous ne nourrissons pas en fait une liste dans ce. Au lieu de cela, nous venons de créer une nouvelle fonction, et nous pouvons alimenter plusieurs listes différentes pour cette fonction.Par exemple, vous pouvez nommer cette fonction:
my_function = sum . sort . filter (> 0)
Ou vous pourriez passer comme argument à une autre fonction:
map (sum . sort . filter (> 0)) my_lists
Vous pouvez essentiellement l'utiliser partout où vous pouvez utiliser toute autre sorte de fonction . C'est juste une manière rapide et lisible de dire "Je veux enchaîner ces fonctions".
Pourquoi n'avez-vous pas besoin d'afficher le paramètre d'entrée dans la définition? Par exemple. comment se fait-il que vous n'écriviez pas 'myOdd x = non. même x'? – unclerojelio
@unclerojelio C'est ce qu'on appelle le style sans point. Plutôt que de définir 'myOdd' en termes de résultat pour un argument donné (" Given 'x',' myOdd' renvoie la même valeur que '(pas. Pair) x'"), il est défini en termes de ce qu'il fait réellement est ("' myOdd' est la fonction qui résulte quand 'not' est composé avec' even' "). – chepner