Fonction d'ordre supérieur

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

En mathématiques et en informatique, les fonctions d'ordre supérieur ou les fonctionnelles sont des fonctions qui ont au moins une des propriétés suivantes :

  • prendre une ou plusieurs fonctions comme entrée ;
  • renvoyer une fonction.

En mathématiques, on les appelle des opérateurs ou des fonctionnelles. La dérivée en calcul infinitésimal est un exemple commun : elle associe une fonction à une autre fonction.

Dans le lambda-calcul non typé, toutes les fonctions sont d'ordre supérieur. Dans le lambda-calcul typé, dont la plupart des langages de programmation fonctionnels sont issus, les fonctions d'ordre supérieur sont généralement celles dont le type contient plus d'une flèche[1]. En programmation fonctionnelle, les fonctions d'ordre supérieur qui retournent d'autres fonctions sont dites curryfiées.

La fonction map présente dans de nombreux langages de programmation fonctionnelle est un exemple de fonction d'ordre supérieur. Elle prend une fonction f comme argument, et retourne une nouvelle fonction qui prend une liste comme argument et applique f à chaque élément. Un autre exemple très courant est celui d'une fonction de tri qui prend en argument une fonction de comparaison ; on sépare ainsi l'algorithme de tri de la comparaison des éléments à trier.

D'autres exemples de fonction d'ordre supérieur incluent la composition de fonctions, l'intégration, et la fonction constante λxy.x.

Alternatives[modifier | modifier le code]

Les langages de programmation peuvent obtenir les mêmes résultats algorithmiques que ceux qui sont obtenus par des fonctions d'ordre supérieur en exécutant dynamiquement du code dans la portée de l'évaluation. Cela se fait généralement par un appel à la commande eval ou à la commande execute. Malheureusement, cette approche a des défauts :

  • Le code argument à exécuter n'est généralement pas typé statiquement. Les langages évaluant dynamiquement du code dépendent du typage dynamique pour déterminer la correction et la sécurité du code à exécuter.
  • L'argument est généralement fourni sous la forme d'une chaine de caractères, chaine dont la valeur ne peut pas être connue avant le moteur d'exécution. La chaine doit être soit compilée durant l'exécution du programme (par du JIT) soit évaluée par l'interpréteur. Cela consomme plus de ressources à l'exécution.

On peut aussi utiliser des macros pour obtenir certains effets des fonctions d'ordre supérieur. Mais les macros ne peuvent généralement pas éviter le problème de capture de variable. Elles peuvent aussi donner lieu à une grande quantité de code dupliqué, qui peut être difficile à optimiser pour un compilateur. Les macros ne sont généralement pas typées, bien qu'elles puissent produire du code fortement typé.

Les objets d'un environnement de programmation orientée objet peuvent être utilisés comme des fonctions d'ordre supérieur. La méthode d'un objet agit essentiellement comme une fonction, et une méthode peut prendre des objets (contenant des méthodes) comme arguments et retourner des objets avec des méthodes. Malheureusement, les objets consomment souvent plus de ressources que des fonctions pures. La syntaxe du langage peut introduire des difficultés supplémentaires : un objet peut être créé pour contenir des paramètres qui sont des fonctions, et toute fonction résultante peut avoir un objet associé.

Voir aussi[modifier | modifier le code]

Liens externes[modifier | modifier le code]

Notes et références[modifier | modifier le code]

  1. Une explication (brève) serait profitable au lecteur non spécialisé avec la notion de type et de flèche dans le contexte des fonctions d'ordre supérieur.