La programmation fonctionnelle en Haskell

Haskell est un langage purement fonctionnel né dans le milieu des années 80 de l’idée de regrouper sous une seule bannière les dernières avancées en date de la théorie des langages de programmation.

Mais qu’est-ce que la programmation fonctionnelle ?

La programmation fonctionnelle est un paradigme de programmation qui décrit une manière d’organiser un programme en utilisant des fonctions. Plutôt que de penser un programme comme une suite d’instructions à appliquer les unes à la suite des autres, on essaye de l’exprimer comme une composition de fonctions. Ces fonctions ont des propriétés particulières (par rapport aux langages non fonctionnels) :

  • La “pureté” : les fonctions ont des résultats qui ne dépendent strictement que de leurs arguments, sans autre effet externe.
  • La “citoyenneté de première classe” : les fonctions ont un statut de valeur.

Exemple de code fonctionnel en Haskell

Pour mieux comprendre ce qu’est la programmation fonctionnelle, voici un exemple simple, codé en Haskell, pour appréhender le concept de composition de fonctions.

Prenons deux fonctions, une qui fait une factorielle et une qui fait la somme d’entiers allant de 0 à n :

Ces deux fonctions utilisent un même principe de récurrence : elles ont une condition d’arrêt (n==0) et un pas inductif qui exprime la relation entre n et n-1. Ce principe peut se représenter par la fonction suivante :

La première équation donne la condition d’arrêt, la seconde indique comment il faut combiner n avec le résultat précédent (n-1).

Notre factorielle et notre somme d’entiers allant de 0 à n peuvent donc se noter simplement :

Les avantages de la programmation fonctionnelle

Comme on peut le voir avec ce petit exemple, la programmation fonctionnelle permet d’avoir un code plus lisible et plus court.

Elle présente aussi d’autres avantages, comme le fait d’avoir un code plus plus structuré et donc plus propre.

Et Haskell dans tout ça ?

Haskell possède les caractéristiques classiques d’un langage fonctionnel. Il présente cependant quelques particularités. Essentiellement, on peut citer un pattern matching extrêmement pratique qui permet une programmation sous forme équationnelle. Mais on a aussi une inférence de type très efficace qui permet au compilateur ou à l’interpréteur de rechercher automatiquement les types associés à des expressions, sans qu’ils soient indiqués explicitement dans le code source. Cette inférence de type permet un système de “Typeclass” particulièrement pratique puisqu’il offre un moyen de définir un comportement commun à plusieurs types.