La programmation

fonctionnelle

en 10 minutes

Jean Detoeuf

Développeur passionné

#craftmanship #TDD #DDD #jobHacker #JVM

@thebignet

Au lycée

Une entrée = une sortie

L'apprentissage de la programmation

String msg = "Hello";
void sayHello(){
  msg += " ";
  msg += "World";
  msg += " ";
  msg += "!";
  System.out.println(msg);
}
sayHello(); // Output : Hello World !
sayHello(); // Output : Hello World ! World !

Code impératif

Description du comment mais pas forcément du quoi

Changements d'états

Code fonctionnel

Plus déclaratif

Evite les changements d'états → thread-safe

Plus simple à comprendre pour un débutant

Ressemble aux fonctions en mathématiques

John von Neumann

Machine à état

Ordinateurs encore basés sur cette architecture

Langage impératif en découle

Fibonacci

F(n) = F(n-1) + F(n-2)
F(0)=0
F(1)=1

Fibonacci impératif

public static int fibonacci(int number) {
  int fib1 = 1;
  int fib2 = 1;
  int fibonacci = fib1;
  for (int i = 2; i < number; i++) {
    fibonacci = fib1 + fib2;
    fib1 = fib2;
    fib2 = fibonacci;
  }
  return fibonacci;
}

for(int i = 1; i  <= 10; i++) {
  System.out.print(fibonacci(i) +" ");
}
// Output: 1 1 2 3 5 8 13 21 34 55

Fibonacci fonctionnel

Stream.iterate(
  new int[]{1, 1},
  fib -> new int[] {fib[1], fib[0] + fib[1]}
)
.mapToInt(fib -> fib[0])
.limit(10)
.forEach(fib -> System.out.print(fib + " "));
// Output: 1 1 2 3 5 8 13 21 34 55

correspond à la définition mathématique

Jugement quasi-majoritaire

val elu = List(
  ("A",1),("A",1),("A",2),("A",5),("A",5),
  ("B",1),("B",1),("B",1),("B",2),("B",2),
  ("C",2),("C",2),("C",3),("C",4),("C",4)
)
.groupBy(_._1) // pour chacun des candidats
.mapValues(_
  .map(_._2)
  .sorted // on les trie par score
  .drop(1) // on supprime le premier
  .dropRight(1) // et le dernier
)
.mapValues(l => l.sum.toFloat / l.length) // ensuite, on prend la moyenne du score
.maxBy(_._2) // on garde celui qui a la meilleure moyenne
._1 // puis on garde le nom du candidat
println(elu)

Le code traduit directement les règles métier

La donnée ne va que dans un sens

Mais encore

Passer des fonctions en paramètre

Composer des fonctions

Chainer des appels (ie fluent API)

Théorie des groupes (algébriques)

Typage fort (issu de la théorie des groupes)

Exemples de langages fonctionnels

Utilisations de la programmation fonctionnelle

MapReduce

React, Redux

Reactive Manifesto ...

SQL ???

La programmation fonctionnelle©

Ca fonctionne

scala.io

Lyon

2 et 3 novembre 2017

Early Birds encore disponibles !

Questions ?

Merci pour votre écoute