Mindmap--- maxWidth: 600 --- # La programmation \\ fonctionnelle ## Histoire ### Née avec le langage LISP \\ en 1958 (John Mc Carthy) ### Basée sur le *lambda-calcul* d'Alonzo Church ## Les principes ### Paradigme de programmation ### Notion centrale : ==fonction== ### La ==composition== remplace la séquence ### La ==récursion== remplace l'itération ### ⛔ Pas de variables, boucles, instructions conditionnelles ## Notation `lambda` ### Permet de définir (en Python) \\une fonction #### souvent *anonyme* : `lambda x: 2*x` #### mais on peut aussi la nommer : `double = lambda x: 2*x` ## Les fonctions \\ d'ordre supérieur ### ✒️ Fonction qui prend une ou plusieurs fonctions en paramètre et/ou qui renvoie une fonction ### `sorted` : le paramètre `key` est une fonction #### 🐍 Exemple : tri selon le deuxième élément de chaque tuple \\`<<< sorted([(1, 5), (2, 1), (3, 2)], key=lambda t: t[1])`\\ `[(2, 1), (3, 2), (1, 5)]` ### `map` : pour appliquer une fonction à tous les éléments d'une liste #### 🐍 Exemple : calcul des doubles\\`<<< list(map(lambda x: 2*x, [1, 2, 3]))` \\`[2, 4, 6]` ### `filter` : pour tester un prédicat sur tous les éléments d'une liste #### 🐍 Exemple : nombres pairs compris entre 0 et 5 \\`<<< list(filter(lambda x: x%2 == 0, range(6)))`\\ `[0, 2, 4]` ### `reduce` : pour appliquer une fonction aux éléments d'une liste, \\deux à deux de façon cumulative ##### 🐍 Exemple : somme des entiers de 1 à 5 \\ `reduce(lambda x, y: x + y, range(1, 6))` ## Transparence référentielle ### ✒️ Si on applique une fonction aux mêmes arguments, on obtient à chaque fois le même résultat ### ❌ Pas d'objets mutables pour éviter les effets de bord \\ `lst.append(e)` ### ✅ Créer des nouveaux objets à la place \\`lst = lst + [e]`