Programmation · concepts · Haskell
C’est quoi une fonction d’ordre supérieur ?
Dans la plupart des langages, une fonction est quelque chose qu’on appelle. En programmation fonctionnelle, une fonction est aussi une valeur : on peut la ranger dans une variable, la passer à une autre fonction, et en récupérer une comme résultat. Une fonction d’ordre supérieur est précisément celle qui fait l’une de ces deux dernières choses. Ce guide explique ce qu’est une fonction d’ordre supérieur, pourquoi map, filter et fold en sont les exemples classiques, comment elles remplacent les boucles, et à quoi elles ressemblent en Haskell.
La définition courte
Une fonction d’ordre supérieur est une fonction qui prend une ou plusieurs fonctions en argument, renvoie une fonction comme résultat, ou les deux. Une fonction qui ne fait ni l’un ni l’autre — qui ne prend et ne renvoie que des valeurs simples comme des nombres ou des chaînes — est dite de premier ordre. Le terme « ordre supérieur » signifie simplement qu’elle opère sur des fonctions comme une fonction ordinaire opère sur des données.
Cela ne marche que dans un langage où les fonctions sont des valeurs de première classe : des choses qu’on peut nommer, passer et renvoyer, exactement comme un entier. Haskell, JavaScript, Python, Swift et bien d’autres traitent les fonctions ainsi, ce qui rend les fonctions d’ordre supérieur possibles.
Les trois classiques : map, filter et fold
Presque toute base de code fonctionnelle s’appuie sur trois fonctions d’ordre supérieur. Chacune prend une fonction en argument et l’applique à une collection :
- map applique une fonction à chaque élément d’une liste et renvoie une nouvelle liste des résultats.
map (+1) [1,2,3]donne[2,3,4]— la fonction(+1)est l’argument. - filter ne garde que les éléments pour lesquels une fonction renvoie vrai.
filter even [1,2,3,4]donne[2,4]— icievenest la fonction qu’on passe. - fold (aussi appelé reduce) réduit une liste à une seule valeur en combinant les éléments deux par deux.
foldr (+) 0 [1,2,3]les additionne jusqu’à6— l’étape de combinaison(+)est la fonction passée en argument.
Dans chaque cas, vous fournissez le petit bout de logique — incrémenter, « est pair », additionner — et la fonction d’ordre supérieur se charge du parcours de la liste. Vous décrivez quoi faire à chaque élément, pas la mécanique du comment les parcourir.
Comment elles remplacent les boucles
Dans un langage impératif, on écrirait une boucle avec un compteur, un accumulateur et un indice explicite. La même intention exprimée avec une fonction d’ordre supérieur tient en une seule ligne, car l’itération est déjà intégrée dans map ou fold. C’est pourquoi le code purement fonctionnel, qui évite les compteurs de boucle mutables, s’appuie autant sur ces fonctions et sur la récursion — les deux couvrent le travail que font ailleurs les boucles. Les listes en compréhension sont souvent un raccourci lisible pour la même combinaison map-et-filter.

Renvoyer une fonction : là où ça devient puissant
L’autre moitié de la définition — les fonctions qui renvoient des fonctions — est tout aussi courante. Une fonction peut construire et renvoyer une nouvelle fonction spécialisée. Un exemple classique est le « fabricant de multiplicateur » : vous lui donnez un nombre et il renvoie une fonction qui multiplie son entrée par ce nombre. Appelez-le avec 3 et vous récupérez une fonction « fois trois » utilisable comme n’importe quelle autre. Le fabricant est d’ordre supérieur parce que son résultat est lui-même une fonction.
En Haskell, c’est tissé dans le langage par la curryfication : toute fonction à plusieurs arguments est en réalité une chaîne de fonctions à un seul argument, chacune renvoyant la suivante. C’est pourquoi map (+1) fonctionne — (+1) est la fonction d’addition avec un argument déjà fourni, qui renvoie une fonction attendant encore l’autre. Cette application partielle, ce sont les fonctions d’ordre supérieur à l’œuvre, souvent sans qu’on y prête attention.
Les fonctions d’ordre supérieur en Haskell
Haskell rend l’idée explicite dans ses signatures de type. Le type de map s’écrit map :: (a -> b) -> [a] -> [b]. Lisez de gauche à droite : le premier argument (a -> b) est lui-même une fonction — c’est la partie « ordre supérieur » — suivi d’une liste de a, produisant une liste de b. Les flèches rendent visible sur le papier qu’une fonction est passée. Le même motif apparaît dans filter :: (a -> Bool) -> [a] -> [a] et dans toute la bibliothèque standard.
On passe souvent ces fonctions en ligne sous forme de lambdas, de petites fonctions anonymes écrites avec une barre oblique inverse, comme map (\x -> x * x) [1,2,3] pour mettre au carré chaque élément. Que vous passiez une fonction nommée, une section d’opérateur comme (*2) ou une lambda, c’est le même mécanisme : une fonction voyageant comme valeur dans une fonction d’ordre supérieur.
Pourquoi elles comptent
Les fonctions d’ordre supérieur permettent d’isoler la forme commune d’un calcul — « faire quelque chose à chaque élément », « garder ceux qui correspondent », « tout combiner » — et de la réutiliser avec une logique différente branchée dessus. Résultat : moins de code répété, un code qui se lit au plus près de son intention, et de petits morceaux de logique testables et composables. C’est la brique sur laquelle s’exprime une grande partie de la programmation fonctionnelle de Haskell, et combinées à l’évaluation paresseuse de Haskell, elles permettent même de mapper et filtrer des listes conceptuellement infinies.
Les compromis honnêtes
Les fonctions d’ordre supérieur demandent un temps d’adaptation : lire un foldr ou un enchaînement map . filter est un savoir-faire, et des lambdas profondément imbriquées peuvent devenir difficiles à suivre. Passer des fonctions partout peut aussi rendre une trace d’appel moins évidente quand un problème survient. Le gain — bien moins de code d’itération répétitif et une logique recomposable — explique pourquoi elles se sont répandues bien au-delà des langages fonctionnels, jusque dans le JavaScript, le Python et le Swift du quotidien. Utilisées avec mesure, elles rendent le code plus court et plus clair ; surutilisées, elles peuvent l’obscurcir comme n’importe quel outil.
Questions fréquentes
C’est quoi une fonction d’ordre supérieur, simplement ?
Une fonction d’ordre supérieur est une fonction qui prend une autre fonction en argument, renvoie une fonction comme résultat, ou les deux. Au lieu de travailler seulement sur des données simples comme des nombres et des chaînes, elle travaille sur des fonctions. Les exemples classiques sont map, filter et fold, qui prennent chacun une petite fonction et l’appliquent à une liste.
map est-elle une fonction d’ordre supérieur ?
Oui. map prend une fonction comme premier argument et l’applique à chaque élément d’une liste, renvoyant une nouvelle liste des résultats. Comme l’un de ses arguments est lui-même une fonction, map est un cas d’école de fonction d’ordre supérieur — tout comme filter et fold pour la même raison.
Quelle différence entre une fonction d’ordre supérieur et de premier ordre ?
Une fonction de premier ordre ne prend et ne renvoie que des valeurs ordinaires, comme des nombres ou des chaînes. Une fonction d’ordre supérieur prend une ou plusieurs fonctions en argument, ou renvoie une fonction, ou les deux. La différence tient à savoir si la fonction opère seulement sur des données ou aussi sur d’autres fonctions.
Les fonctions d’ordre supérieur n’existent-elles qu’en Haskell ?
Non. Elles existent dans tout langage qui traite les fonctions comme des valeurs de première classe — des valeurs qu’on peut ranger, passer et renvoyer. Haskell, JavaScript, Python, Swift et bien d’autres les gèrent. Haskell rend l’idée particulièrement visible grâce à ses signatures de type et à la curryfication, mais le concept est répandu.
Une machine Linux pour builder et exécuter votre code Haskell
Essayer ces fonctions d’ordre supérieur pour de vrai — les charger dans GHCi, builder un projet avec map et fold, puis l’exécuter — est plus simple sur une vraie machine Linux qu’un portable. Un serveur cloud vous donne le contrôle total pour installer GHC et une chaîne d’outils Haskell dans un environnement propre, accessible en SSH. Infomaniak — un hébergeur suisse respectueux de la vie privée — propose des serveurs cloud pour exactement cela.
Voir Infomaniak Cloud →Lien affilié — il soutient ces guides gratuits.
Parcourez d’autres explications claires dans notre index des guides.