Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Functional programming intro

Functional programming intro

Some basics (in french) of functional programming (purity, immutability, first class function, higher order function, composition...)

Avatar for VincentCordobes

VincentCordobes

August 01, 2018
Tweet

More Decks by VincentCordobes

Other Decks in Programming

Transcript

  1. Sommaire – Fonction pure – Immutabilité – Transparence référentielle –

    Fonction de 1er classe – Fonction d’ordre supérieur – Composition – Curryfication 3
  2. Fonction pure 5 F. pure Immut. Transp. référentielle F. de

    1ère classe F. d'ordre sup Composition Curryfication Résultat ne dépend que des arguments de la fonction Pas d’effet de bord : (altération d’un état global, entrées/sorties, etc…)
  3. Pure ou pas ? 6 F. pure Immut. Transp. référentielle

    F. de 1ère classe F. d'ordre sup Composition Curryfication const PI = 3.14 const calculateArea = (radius) => 2 * PI * radius Non
  4. Pure ou pas ? 7 F. pure Immut. Transp. référentielle

    F. de 1ère classe F. d'ordre sup Composition Curryfication let count = 0; const incrementBy(n) => { count = count + n } Non
  5. Pure ou pas ? 8 F. pure Immut. Transp. référentielle

    F. de 1ère classe F. d'ordre sup Composition Curryfication const logData = (data) => console.log(data); Non
  6. Bénéfices 9 F. pure Immut. Transp. référentielle F. de 1ère

    classe F. d'ordre sup Composition Curryfication Testable Déterministe
  7. En vrai 10 F. pure Immut. Transp. référentielle F. de

    1ère classe F. d'ordre sup Composition Curryfication Essayer de minimiser le # de fonctions impures Le monde Impure pure
  8. Immutablilité 12 F. pure Immut. Transp. référentielle F. de 1ère

    classe F. d'ordre sup Composition Curryfication Variable dont la valeur ne peut pas changer après son initialisation Si changement → nouvelle variable
  9. Mutabilité 13 F. pure Immut. Transp. référentielle F. de 1ère

    classe F. d'ordre sup Composition Curryfication const me = { name: 'Vince', age: 1993 } console.log(me.age) // 13 whatsMyAge(me) // 23 console.log(me.age) // 498 ??? C’est lui !
  10. Bénéfices 14 F. pure Immut. Transp. référentielle F. de 1ère

    classe F. d'ordre sup Composition Curryfication Garantie la valeur d’une variable Prévisibilité Le concept de “temps” disparait Pas besoin de “copie défensive” Programmation concurrente et répartie …
  11. Mutabilité toujours une mauvaise idée ? 15 F. pure Immut.

    Transp. référentielle F. de 1ère classe F. d'ordre sup Composition Curryfication NON
  12. Transparence référentielle 17 F. pure Immut. Transp. référentielle F. de

    1ère classe F. d'ordre sup Composition Curryfication function square(x) { return x * x; } f(4); // 16 f(4); // 16 f(4); // 16 f(4); // 16 f(4); // 16 f(4); // 16 f(4); // 16 f(4); // 16 f(4); // 16 f(4); // 16 16
  13. Transparence référentielle 18 F. pure Immut. Transp. référentielle F. de

    1ère classe F. d'ordre sup Composition Curryfication Remplacer une expression par sa valeur sans changer le comportement du programme
  14. Transparence référentielle 19 F. pure Immut. Transp. référentielle F. de

    1ère classe F. d'ordre sup Composition Curryfication function generateNumber(max) { return Math.random() * max; } generateNumber(10) // 3.6827309027380584 generateNumber(10) // 0.08913790964415913 generateNumber(10) // 9.65460856563936 generateNumber(10) // 4.491444191527572 Pas référentiellement transparente
  15. Bénéfices 20 F. pure Immut. Transp. référentielle F. de 1ère

    classe F. d'ordre sup Composition Curryfication Refactoring Optimisations: • Memoization • Recherche des sous expressions communes • Parallélisme • etc…
  16. Fonction comme valeur de première classe 22 F. pure Immut.

    Transp. référentielle F. de 1ère classe F. d'ordre sup Composition Curryfication Les fonctions sont traitées comme des valeurs On peut : • les passer en tant qu’argument • les renvoyer en tant que valeur de retour • les assigner à des variables ou constantes
  17. Fonction d’ordre supérieur Peut accepter une ou plusieurs fonction en

    argument Peut renvoyer une fonction 24 F. pure Immut. Transp. référentielle F. de 1ère classe F. d'ordre sup Composition Curryfication
  18. Renvoyer une fonction 25 F. pure Immut. Transp. référentielle F.

    de 1ère classe F. d'ordre sup Composition Curryfication function createDateFormatter(format, locale = 'en') { return (date) => moment(date).locale(locale).format(format); } const formatForCustomer = createDateFormatter(dateFormat.CUSTOMER, 'fr'); const logDate = createDateFormatter(dateFormat.LOG); currentDate = new Date(); console.log(formatForCustomer(currentDate)); console.log(logDate(currentDate));
  19. Map 26 F. pure Immut. Transp. référentielle F. de 1ère

    classe F. d'ordre sup Composition Curryfication const numbers = [1, 2, 3] const doubles = numbers.map(x => x * 2) // [ 2, 4, 6 ]
  20. Filter 27 F. pure Immut. Transp. référentielle F. de 1ère

    classe F. d'ordre sup Composition Curryfication const numbers = [1, 2, 3] const filtered = numbers.filter(x => x > 1) // [2, 3]
  21. Reduce 28 F. pure Immut. Transp. référentielle F. de 1ère

    classe F. d'ordre sup Composition Curryfication const sum = [1, 2, 3].reduce((prev, curr) => { return prev + curr; }, 0);
  22. Reduce 29 F. pure Immut. Transp. référentielle F. de 1ère

    classe F. d'ordre sup Composition Curryfication let sum = List.fold_left (+) [1; 2; 3]
  23. Composition 31 F. pure Immut. Transp. référentielle F. de 1ère

    classe F. d'ordre sup Composition Curryfication f g
  24. Composition 32 F. pure Immut. Transp. référentielle F. de 1ère

    classe F. d'ordre sup Composition Curryfication f g (g o f)
  25. Composition 33 F. pure Immut. Transp. référentielle F. de 1ère

    classe F. d'ordre sup Composition Curryfication (g f)(x) = g(f(x)) const aKiwi = g(f( )) const aKiwi = compose(g,f)( )
  26. Composition 34 F. pure Immut. Transp. référentielle F. de 1ère

    classe F. d'ordre sup Composition Curryfication ChopWood package makeDoor const aPackagedDoor = compose( package, makeDoor, chopWood)( ) processWood makeBook const aPackagedBook = compose( package, makeBook, processWood, chopWood)( )
  27. Composition - Pipe operator 35 F. pure Immut. Transp. référentielle

    F. de 1ère classe F. d'ordre sup Composition Curryfication let aPackagedBook = |> chopWood |> processWood |> makeBook |> package const aPackagedBook = compose( package, makeBook, processWood, chopWood)( )
  28. Application partielle 37 F. pure Immut. Transp. référentielle F. de

    1ère classe F. d'ordre sup Composition Curryfication f(a, b) = a + b 5 5
  29. Application partielle Exemple lodash 38 F. pure Immut. Transp. référentielle

    F. de 1ère classe F. d'ordre sup Composition Curryfication function add(a, b) { return a + b; } const addTwo = _.partial(add, 2); addTwo(3) // 5 const addOneWithTwo = _.partial(add, 1, 2) addOneWithTwo() // 3
  30. Application partielle - javascript only 39 F. pure Immut. Transp.

    référentielle F. de 1ère classe F. d'ordre sup Composition Curryfication function add(a, b) { return a + b; } const addTwo = add.bind(null, 2); addTwo(3) // 5
  31. Curryfication 40 F. pure Immut. Transp. référentielle F. de 1ère

    classe F. d'ordre sup Composition Curryfication function add(a, b) { return a + b; } const curriedAdd = _.curry(add); const addTwo = curriedAdd(2); addTwo(3) // 5 curriedAdd(2)(3) // 5
  32. Curryfication 41 F. pure Immut. Transp. référentielle F. de 1ère

    classe F. d'ordre sup Composition Curryfication const add = (a) => (b) => a + b; const addFive = add(5); addFive(3); // 8 add(5)(7); // 12
  33. Currification - cas d’utilisation 42 F. pure Immut. Transp. référentielle

    F. de 1ère classe F. d'ordre sup Composition Curryfication const choopWoodAndCreateDoor = compose( makeDoor, chopWood, ) const choopWoodAndCreateDoor = compose( makeDoor, chopWood( ), ) const choopWoodAndCreateDoor = compose( makeDoor, chopWood( ), ) choopWoodAndCreateDoor( ) chopWood est curryfié !
  34. Curryfication 43 F. pure Immut. Transp. référentielle F. de 1ère

    classe F. d'ordre sup Composition Curryfication let add a b = a + b let addFive = add 5 addFive 3 (* 8 *) add 5 7 (* 12 *) val add: int -> int -> int