SlideShare une entreprise Scribd logo
1  sur  46
Télécharger pour lire hors ligne
La programmation
fonctionnelle
En 45 minutes
Raphael Javaux
Plan
● Kesako ?
● Haskell
○ “An advanced purely-functional programming language”
● Stuff
● Real world stuff
● Aller plus loin
Plan
● Kesako ?
● Haskell
○ “An advanced purely-functional programming language”
● Stuff
● Real world stuff
● Aller plus loin
>>> xs = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> map(lambda x: x * x, xs)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
Kesako ?
λ ?
>>> xs = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> map(lambda x: x * x, xs)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
Kesako ?
λ ?
Pas vraiment ...
Kesako ?
« La programmation fonctionnelle est un style de
programmation qui met l'accent sur l'évaluation d’
expressions, plutôt que sur l'exécution de commandes. »
Graham Hutton
Kesako ?
Les programmes impératifs sont des séquences d’instructions
void estPair(int x)
{
if (x % 2 == 0)
printf("x est pair !n");
else
printf("x est impair !n");
}
Temps
Fais ça
puis ça
puis ça
...
Kesako ?
La programmation fonctionnelle retire cette notion de
temps.
“The world's most popular functional language”
Kesako ?
Comment ?
Une fonction ou une expression accepte des données en
entrée et en retourne de nouvelles.
Mais ne modifie aucun état global, ni aucun de ses
arguments.
Kesako ?
Comment ?
● Pas de modification des données
○ Pour modifier une donnée, on en crée une nouvelle
copie
● Pas d’effet de bord
○ Pas de modification de variables globales
○ Pas d’entrée/sortie
Kesako ?
struct rect_t {
int x, y, width, height;
}
void move(rect_t *rect, int dx, int dy)
{
rect->x += dx;
rect->y += dy;
}
struct rect_t {
int x, y, width, height;
}
rect_t move(rect_t rect, int dx, int dy)
{
return {
.x = rect.x + dx,
.y = rect.y + dy,
.width = rect.width,
.height = rect.height
};
}
Impératif Fonctionnel
Kesako ?
rect_t my_rectangle()
{
rect_t rect = {
.x = 0, .y = 0,
.width = 100, .height = 100
};
move(&rect, 10, 10);
return rect;
}
rect_t my_rectangle()
{
rect_t rect = {
.x = 0, .y = 0,
.width = 100, .height = 100
};
return move(rect, 10, 10);
}
Impératif Fonctionnel
Kesako ?
● Les fonctions sont :
○ déterministes
○ plus facilement testables
○ thread-safes
○ plus modulables
○ plus réutilisables
● Code plus facilement lisible
● Moins d’erreurs
● Optimisations
● Performances
○ Mais pas toujours ...
● Pas d’entrées/sorties
Avantages Désavantages
Récursion
?
Impératif Fonctionnel
int sum_n(int n)
{
int sum = 0;
for (int i = 1; i <= n; i++)
sum += i;
return sum;
}
Modification de variable
Récursion
int sum_n(int n)
{
int sum = 0;
for (int i = 1; i <= n; i++)
sum += i;
return sum;
}
int sum_n(int n)
{
if (n <= 0)
return 0;
else
return n + sum_n(n - 1);
}
Impératif Fonctionnel
int sum_n(int n)
{
int sum = 0;
for (int i = 1; i <= n; i++)
sum += i;
return sum;
}
Modification de variable
Plan
● Kesako ?
● Haskell
○ “An advanced purely-functional programming language”
● Stuff
● Real world stuff
● Aller plus loin
Haskell - Syntaxe
-- Tous les opérateurs sont des fonctions
(+) :: Int -> Int -> Int
-- Les fonctions sont des valeurs
add :: Int -> Int -> Int
add = +
-- Une fonction a 2 arguments est une
-- fonction à 1 argument qui retourne
-- une fonction à 1 argument !
next :: Int -> Int
next = add 1
-- Ou directement
next = + 1
two = next 1 -- Equivalent à “add 1 1”
pi :: Double
pi = 3.1416
square :: Int -> Int
square x = x * x
-- Pas de parenthèse pour les appels de
-- fonctions
four :: Int
four = square 2
-- Pattern matching
isFive 5 = True
isFive x = False
-- Récursion
sumN n = if n <= 0 then 0
else n + sumN (n - 1)
Haskell - Listes
-- Liste vide
empty :: [Int]
empty = []
-- ":" permet d'ajouter un élément au
début de la liste
(:) :: Int -> [Int] -> [Int]
one :: [Int]
one = 1 : empty
xs :: [Int]
xs = 1 : 2 : 3 : 4 : 5 : []
-- Equivalent à :
xs = [ 1, 2, 3, 4, 5 ]
-- Pattern matching sur ":" et "[]"
length :: [Int] -> Int
length [] = 0
length (y : ys) = 1 + length ys
-- Concaténation de deux listes avec "++"
(++) :: [Int] -> [Int] -> [Int]
[] ++ zs = zs
(y : ys) ++ zs = y : (ys ++ zs)
-- Donne les premiers éléments d'une liste
take n [] = []
take 0 ys = []
take n (y : ys) = y : take (n - 1) ys
xs = : 1 2: 3: 4: 5: []
Plan
● Kesako ?
● Haskell
○ “An advanced purely-functional programming language”
● Stuff
● Real world stuff
● Aller plus loin
Stuff - Higher-order functions
-- Les fonctions peuvent elles-mêmes
-- recevoir des fonctions en argument :
map :: (Int -> Int) -> [Int] -> [Int]
map f [] = []
map f (x : xs) = f x : map f xs
filter :: (Int -> Bool) -> [Int] -> [Int]
filter p [] = []
filter p (x : xs) =
if p x then x : filter p xs
else filter p xs
>>> map square [ 1, 2, 3, 4, 5 ]
[ 1, 4, 9, 16, 25 ]
>>> filter (> 3) [ 10, 2, 3, 5, 0, 7 ]
[ 10, 5, 7 ]
Stuff - Quick Sort !
qsort [ 5, 2, 3, 10, 0, 7 ]
qsort [ 2, 3, 0 ] ++ [ 5 ] ++ qsort [ 7, 10 ]
qsort [ 0 ] ++ [ 2 ] ++ qsort [ 3 ] qsort [] ++ [ 7 ] ++ qsort [ 10 ]
[] ++ [ 0 ] ++ [] [] ++ [ 3 ] ++ [] [] ++ [ 10 ] ++ []
qsort [ 5, 2, 3, 10, 0, 7 ]
qsort [ 2, 3, 0 ] ++ [ 5 ] ++ qsort [ 7, 10 ]
qsort [ 0 ] ++ [ 2 ] ++ qsort [ 3 ] qsort [] ++ [ 5 ] ++ qsort [ 10 ]
[] ++ [ 0 ] ++ [] [] ++ [ 3 ] ++ [] [] ++ [ 10 ] ++ []
Stuff - Quick Sort !
qsort :: [Int] -> [Int]
qsort [] = []
qsort (x : xs) = qsort lesser ++ [ x ] ++ qsort greater
where
lesser = filter (<= x) xs
greater = filter (> x) xs
Stuff - Quick Sort !
>>> qsort oneMillion
5.05 secs
Stuff - Quick Sort !
>>> qsort oneMillion
5.05 secs
>>> take 100 (qsort oneMillion)
Stuff - Haskell is lazy
>>> qsort oneMillion
5.05 secs
>>> take 100 (qsort oneMillion)
0.48 secs
WTF ?!!?
Stuff - Haskell is lazy
● Haskell est un langage à évaluation « paresseuse »
○ Une donnée calculée que lorsqu’elle est accèdée pour
la première fois
● Chaque noeud d’une liste est une donnée : 1 2: []
Stuff - Haskell is lazy
take 3 (qsort [ 5, 2, 3, 10, 0, 7 ])
qsort [ 2, 3, 0 ] ++ [ 5 ] ++ qsort [ 7, 10 ]
qsort [ 0 ] ++ [ 2 ] ++ qsort [ 3 ] qsort [] ++ [ 5 ] ++ qsort [ 10 ]
[] ++ [ 0 ] ++ [] [] ++ [ 3 ] ++ [] [] ++ [ 10 ] ++ []
● Haskell est un langage à évaluation « paresseuse »
○ Une donnée calculée que lorsqu’elle est accèdée pour
la première fois
● Chaque noeud d’une liste est une donnée : 1 2: []
Plan
● Kesako ?
● Haskell
○ “An advanced purely-functional programming language”
● Stuff
● Real world stuff
● Aller plus loin
Real world stuff - Entrées sorties
IO
Fonctionnel
Real world stuff - Entrées et sorties
-- Les fonctions ayant des effets de bords retournent “ IO a ”,
-- où “ a ” est la valeur retournée.
-- “ () ” est l'équivalent de “ void ”.
putStrLn :: Text -> IO ()
readFile :: FilePath -> IO Text
writeFile :: FilePath -> Text -> IO ()
getArgs :: IO [Text]
Real world stuff - Entrées et sorties
-- “ do ” permet de séquencer des fonctions à effets de bord
-- comme dans un langage impératif.
-- “ <- ” permet de récupérer le résutat d’une “ IO ”.
main :: IO ()
main = do
[ path ] <- getArgs
c <- readFile path
putStrLn c
Real world stuff - Grep
$ grep "Maître" le_corbeau_et_le_renard.txt
Maître Corbeau, sur un arbre perché,
Maître Renard, par l’odeur alléché,
Real world stuff - Grep
lines :: Text -> [Text]
unlines :: [Text] -> Text
isInfixOf :: Text -> Text -> Bool
grep :: Text -> Text -> Text
grep pattern text = unlines matches
where
ls = lines text
matches = filter (isInfixOf pattern) ls
main = do
[pattern, path] <- getArgs
text <- readFile path
putStrLn (grep pattern text)
Real world stuff - Grep
$ du -h de_bello_gallico.txt
144K de_bello_gallico.txt
$ grep "Belg" de_bello_gallico.txt
[ 26 lignes ... ]
0.003 secs (1 868 870 cycles CPU)
$ ./GrepHS "Belg" de_bello_gallico.txt
[ 26 lignes ... ]
0.008 secs (6 603 153 cycles CPU, GC : 1.4%) - Mem. max. : 1 MB
Real world stuff - Grep
$ du -h de_bello_gallico_large.txt
141M de_bello_gallico_large.txt
$ grep "Belg" de_bello_gallico_large.txt
[ 26 000 lignes ... ]
0.0988 secs (326 516 484 cycles CPU)
$ ./GrepHS "Belg" de_bello_gallico_large.txt
[ 26 000 lignes ... ]
1.632 secs (5 973 858 671 cycles CPU, GC : 0.5 %) - Mem. max. : 1 MB
Real world stuff - Haskell lazy again !
$ du -h de_bello_gallico_large.txt
141M de_bello_gallico_large.txt
$ grep "Belg" de_bello_gallico_large.txt
[ 26 000 lignes ... ]
0.0988 secs (326 516 484 cycles CPU)
$ ./GrepHS "Belg" de_bello_gallico_large.txt
[ 26 000 lignes ... ]
1.632 secs (5 973 858 671 cycles CPU, GC : 0.5 %) - Mem. max. : 1 MB
WTF ?!!??
text <- readFile path
putStrLn (grep pattern text)
Real world stuff - Haskell lazy again !
text =
[]
: alléchénLui tint à peu près ce langage :n"Hé ! bonjour, Monsieur du Corbeau.nQue vous êtes joli
: êtes le Phenix des hôtes de ces bois.nÀ ces mots le Corbeau ne se sent pas de joie :nEt pour montrer
: ! que vous me semblez beau !nSans mentir, si votre ramagenSe rapporte à votre plumage,nVous
: sa belle voix,nIl ouvre un large bec, laisse tomber sa proie.nLe Renard s’en saisit, et dit : Mon bon
: un fromage sans doute.nLe Corbeau honteux et confusnJura, qu’on ne l’y prendrait plus.
: Monsieur,nApprenez que tout flatteurnVit aux dépens de celui qui l’écoute.nCette leçon vaut bien
Maître Corbeau sur un arbre perché,nTenait en son bec un fromage.nMaître Renard par l’odeur:
Plan
● Kesako ?
● Haskell
○ “An advanced purely-functional programming language”
● Stuff
● Real world stuff
● Aller plus loin
Aller plus loin - Pourquoi ?
● Programmer ...
○ … plus modulable
○ … plus réutilisable
○ … plus rigoureusement
● Monstrueusement efficace pour ...
○ … la programmation parallèle et concurrente
○ … le backend et les réseaux
● De plus en plus de langages tendent vers le paradigme
Aller plus loin - Langages
Fonctionnel
O
rienté
objet
Im
pératif
LISPs
Aller plus loin - Langages
Fonctionnel
O
rienté
objet
Im
pératif
LISPs
Microsoft .NET
Java VM
Réseaux et haute
disponibilité
Très bas niveau
Aller plus loin - Langages
Fonctionnel
O
rienté
objet
Im
pératif
LISPs
Moyenne sur 13 benchmarks
Source : http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.html
Benchmark des context-switchs.
Source : http://benchmarksgame.alioth.debian.org/u64q/performance.php?test=threadring

Contenu connexe

Tendances

20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat
SOAT
 

Tendances (20)

Theme 7
Theme 7Theme 7
Theme 7
 
Développement informatique : Algorithmique II : Techniques de recherche en in...
Développement informatique : Algorithmique II : Techniques de recherche en in...Développement informatique : Algorithmique II : Techniques de recherche en in...
Développement informatique : Algorithmique II : Techniques de recherche en in...
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French Course
 
Arbre et algorithme de recherche
Arbre et algorithme de rechercheArbre et algorithme de recherche
Arbre et algorithme de recherche
 
Chapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaChapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En Java
 
Chapitre 2: String en Java
Chapitre 2:  String en JavaChapitre 2:  String en Java
Chapitre 2: String en Java
 
20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat
 
Python avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exceptionPython avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exception
 
Tests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnitTests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnit
 
Programming language python 2021
Programming language python 2021Programming language python 2021
Programming language python 2021
 
Presentation Csharp et winforms
Presentation Csharp et winformsPresentation Csharp et winforms
Presentation Csharp et winforms
 
Python avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesPython avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de données
 
Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...
 
Polymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraitePolymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraite
 
Initiation r
Initiation rInitiation r
Initiation r
 
Change mind about JS
Change mind about JSChange mind about JS
Change mind about JS
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
Python avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codagePython avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codage
 
cours algorithme
cours algorithmecours algorithme
cours algorithme
 
Ch04
Ch04Ch04
Ch04
 

En vedette

Cours algorithme
Cours algorithmeCours algorithme
Cours algorithme
badr zaimi
 
Opensourceday 2014-iot
Opensourceday 2014-iotOpensourceday 2014-iot
Opensourceday 2014-iot
Tugdual Grall
 
Devoirs Algorithme + correction pour 4 si
Devoirs Algorithme + correction pour 4 siDevoirs Algorithme + correction pour 4 si
Devoirs Algorithme + correction pour 4 si
Narûtö Bàl'Sèm
 
exercices-corriges-dalgorithmique
exercices-corriges-dalgorithmiqueexercices-corriges-dalgorithmique
exercices-corriges-dalgorithmique
fast xp
 
E bulletin (vol1 - no. 25)
E bulletin (vol1 - no. 25)E bulletin (vol1 - no. 25)
E bulletin (vol1 - no. 25)
Communication_HT
 
Cours 3 pensée réflexive tube digestif
Cours 3 pensée réflexive tube digestifCours 3 pensée réflexive tube digestif
Cours 3 pensée réflexive tube digestif
ericlach
 

En vedette (20)

Introduction to NoSQL with MongoDB - SQLi Workshop
Introduction to NoSQL with MongoDB - SQLi WorkshopIntroduction to NoSQL with MongoDB - SQLi Workshop
Introduction to NoSQL with MongoDB - SQLi Workshop
 
Audacity
AudacityAudacity
Audacity
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelle
 
Cours algorithme
Cours algorithmeCours algorithme
Cours algorithme
 
Opensourceday 2014-iot
Opensourceday 2014-iotOpensourceday 2014-iot
Opensourceday 2014-iot
 
Arthrose et arthrite
Arthrose et arthriteArthrose et arthrite
Arthrose et arthrite
 
Electricité
ElectricitéElectricité
Electricité
 
Devoirs Algorithme + correction pour 4 si
Devoirs Algorithme + correction pour 4 siDevoirs Algorithme + correction pour 4 si
Devoirs Algorithme + correction pour 4 si
 
Correction
CorrectionCorrection
Correction
 
Introduction à la programmation fonctionnelle
Introduction à la programmation fonctionnelle Introduction à la programmation fonctionnelle
Introduction à la programmation fonctionnelle
 
exercices-corriges-dalgorithmique
exercices-corriges-dalgorithmiqueexercices-corriges-dalgorithmique
exercices-corriges-dalgorithmique
 
Serie2
Serie2Serie2
Serie2
 
E bulletin (vol1 - no. 25)
E bulletin (vol1 - no. 25)E bulletin (vol1 - no. 25)
E bulletin (vol1 - no. 25)
 
Système d’Information Géographique et Télédétection: généralités
Système d’Information Géographique et Télédétection: généralitésSystème d’Information Géographique et Télédétection: généralités
Système d’Information Géographique et Télédétection: généralités
 
La lutte anti-vectorielle
La lutte anti-vectorielle La lutte anti-vectorielle
La lutte anti-vectorielle
 
Cours 3 pensée réflexive tube digestif
Cours 3 pensée réflexive tube digestifCours 3 pensée réflexive tube digestif
Cours 3 pensée réflexive tube digestif
 
Rôle des anticorps dans la protection du paludisme
Rôle des anticorps dans la protection du paludismeRôle des anticorps dans la protection du paludisme
Rôle des anticorps dans la protection du paludisme
 
Protocoles et méthodologies pour l'analyse de situation concernant le paludisme
Protocoles et méthodologies pour l'analyse de situation concernant le paludismeProtocoles et méthodologies pour l'analyse de situation concernant le paludisme
Protocoles et méthodologies pour l'analyse de situation concernant le paludisme
 
Si vous n'aviez pas de limites en ressources financières et humaines, quelles...
Si vous n'aviez pas de limites en ressources financières et humaines, quelles...Si vous n'aviez pas de limites en ressources financières et humaines, quelles...
Si vous n'aviez pas de limites en ressources financières et humaines, quelles...
 
Positionner les différents outils actuels de diagnostic au sein du système de...
Positionner les différents outils actuels de diagnostic au sein du système de...Positionner les différents outils actuels de diagnostic au sein du système de...
Positionner les différents outils actuels de diagnostic au sein du système de...
 

Similaire à Programmation fonctionnelle

Mat lab1
Mat lab1Mat lab1
Mat lab1
fouadDD
 
Data Mining (Partie 2).pdf
Data Mining (Partie 2).pdfData Mining (Partie 2).pdf
Data Mining (Partie 2).pdf
OuailChoukhairi
 

Similaire à Programmation fonctionnelle (20)

La programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCamlLa programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCaml
 
Introduction à Ruby
Introduction à RubyIntroduction à Ruby
Introduction à Ruby
 
ALF 11 - WebAssembly
ALF 11 - WebAssemblyALF 11 - WebAssembly
ALF 11 - WebAssembly
 
ALF 8 - Generation du code
ALF 8 - Generation du codeALF 8 - Generation du code
ALF 8 - Generation du code
 
ALF 11 - Diagrame de flux de controlle
ALF 11 - Diagrame de flux de controlleALF 11 - Diagrame de flux de controlle
ALF 11 - Diagrame de flux de controlle
 
Implementing a key/value store
Implementing a key/value storeImplementing a key/value store
Implementing a key/value store
 
Introduction Clojure - Geneva JUG - Octobre 2012
Introduction Clojure - Geneva JUG - Octobre 2012Introduction Clojure - Geneva JUG - Octobre 2012
Introduction Clojure - Geneva JUG - Octobre 2012
 
Cours de Matlab
Cours de MatlabCours de Matlab
Cours de Matlab
 
Mat lab1
Mat lab1Mat lab1
Mat lab1
 
Data Mining (Partie 2).pdf
Data Mining (Partie 2).pdfData Mining (Partie 2).pdf
Data Mining (Partie 2).pdf
 
WTF - What's The Fold - Bordeaux JUG 2013
WTF - What's The Fold - Bordeaux JUG 2013WTF - What's The Fold - Bordeaux JUG 2013
WTF - What's The Fold - Bordeaux JUG 2013
 
Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5
 
ALF 11 - Diagramme de flux de contrôle et WebAssembly
ALF 11 - Diagramme de flux de contrôle et WebAssemblyALF 11 - Diagramme de flux de contrôle et WebAssembly
ALF 11 - Diagramme de flux de contrôle et WebAssembly
 
20080610 04 - Explorations visuelles de programmes
20080610 04 - Explorations visuelles de programmes20080610 04 - Explorations visuelles de programmes
20080610 04 - Explorations visuelles de programmes
 
ALF 3 - Expressions régulières et Lexer
ALF 3 - Expressions régulières et Lexer ALF 3 - Expressions régulières et Lexer
ALF 3 - Expressions régulières et Lexer
 
Une Introduction à R
Une Introduction à RUne Introduction à R
Une Introduction à R
 
TP3: Comportement Temps Réel de l'Agent Perception
TP3: Comportement Temps Réel de l'Agent PerceptionTP3: Comportement Temps Réel de l'Agent Perception
TP3: Comportement Temps Réel de l'Agent Perception
 
SdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoireSdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoire
 
Spark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystSpark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et Catalyst
 
Google Developer Group (GDG) Aix-Marseille #1 (27/08/2018)
Google Developer Group (GDG) Aix-Marseille #1 (27/08/2018)Google Developer Group (GDG) Aix-Marseille #1 (27/08/2018)
Google Developer Group (GDG) Aix-Marseille #1 (27/08/2018)
 

Plus de Geeks Anonymes

Plus de Geeks Anonymes (20)

Programmer sous Unreal Engine
Programmer sous Unreal EngineProgrammer sous Unreal Engine
Programmer sous Unreal Engine
 
Implémentation efficace et durable de processus métiers complexes
Implémentation efficace et durable de processus métiers complexesImplémentation efficace et durable de processus métiers complexes
Implémentation efficace et durable de processus métiers complexes
 
Managing Open Source Licenses (Geeks Anonymes)
Managing Open Source Licenses (Geeks Anonymes)Managing Open Source Licenses (Geeks Anonymes)
Managing Open Source Licenses (Geeks Anonymes)
 
Reprendre le contrôle de ses données
Reprendre le contrôle de ses donnéesReprendre le contrôle de ses données
Reprendre le contrôle de ses données
 
Geeks Anonymes - Le langage Go
Geeks Anonymes - Le langage GoGeeks Anonymes - Le langage Go
Geeks Anonymes - Le langage Go
 
Le rôle du testeur et le Blackbox testing
Le rôle du testeur et le Blackbox testingLe rôle du testeur et le Blackbox testing
Le rôle du testeur et le Blackbox testing
 
Kubernetes
KubernetesKubernetes
Kubernetes
 
Vulnérabilités au cœur des applications Web, menaces et contre-mesures
 Vulnérabilités au cœur des applications Web, menaces et contre-mesures Vulnérabilités au cœur des applications Web, menaces et contre-mesures
Vulnérabilités au cœur des applications Web, menaces et contre-mesures
 
191121 philippe teuwen cryptographie et attaques materielles
191121 philippe teuwen cryptographie et attaques materielles191121 philippe teuwen cryptographie et attaques materielles
191121 philippe teuwen cryptographie et attaques materielles
 
"Surfez couverts !" - Conseils de Cyber securité
"Surfez couverts !" - Conseils de Cyber securité "Surfez couverts !" - Conseils de Cyber securité
"Surfez couverts !" - Conseils de Cyber securité
 
Introduction au développement mobile - développer une application iOS et Andr...
Introduction au développement mobile - développer une application iOS et Andr...Introduction au développement mobile - développer une application iOS et Andr...
Introduction au développement mobile - développer une application iOS et Andr...
 
Le langage rust
Le langage rustLe langage rust
Le langage rust
 
Test your code
Test your codeTest your code
Test your code
 
Intelligence artificielle et propriété intellectuelle
Intelligence artificielle et propriété intellectuelleIntelligence artificielle et propriété intellectuelle
Intelligence artificielle et propriété intellectuelle
 
Pour une histoire plophonique du jeu video
Pour une histoire plophonique du jeu videoPour une histoire plophonique du jeu video
Pour une histoire plophonique du jeu video
 
Become Rick and famous, thanks to Open Source
Become Rick and famous, thanks to Open SourceBecome Rick and famous, thanks to Open Source
Become Rick and famous, thanks to Open Source
 
Reconnaissance vocale et création artistique
Reconnaissance vocale et création artistiqueReconnaissance vocale et création artistique
Reconnaissance vocale et création artistique
 
Natural Language Processing
Natural Language ProcessingNatural Language Processing
Natural Language Processing
 
Sécurité, GDPR : vos données ont de la valeur
Sécurité, GDPR : vos données ont de la valeur Sécurité, GDPR : vos données ont de la valeur
Sécurité, GDPR : vos données ont de la valeur
 
Modern sql
Modern sqlModern sql
Modern sql
 

Programmation fonctionnelle

  • 1. La programmation fonctionnelle En 45 minutes Raphael Javaux
  • 2. Plan ● Kesako ? ● Haskell ○ “An advanced purely-functional programming language” ● Stuff ● Real world stuff ● Aller plus loin
  • 3. Plan ● Kesako ? ● Haskell ○ “An advanced purely-functional programming language” ● Stuff ● Real world stuff ● Aller plus loin
  • 4. >>> xs = [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> map(lambda x: x * x, xs) [1, 4, 9, 16, 25, 36, 49, 64, 81] Kesako ? λ ?
  • 5. >>> xs = [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> map(lambda x: x * x, xs) [1, 4, 9, 16, 25, 36, 49, 64, 81] Kesako ? λ ? Pas vraiment ...
  • 6. Kesako ? « La programmation fonctionnelle est un style de programmation qui met l'accent sur l'évaluation d’ expressions, plutôt que sur l'exécution de commandes. » Graham Hutton
  • 7. Kesako ? Les programmes impératifs sont des séquences d’instructions void estPair(int x) { if (x % 2 == 0) printf("x est pair !n"); else printf("x est impair !n"); } Temps Fais ça puis ça puis ça ...
  • 8. Kesako ? La programmation fonctionnelle retire cette notion de temps.
  • 9. “The world's most popular functional language”
  • 10. Kesako ? Comment ? Une fonction ou une expression accepte des données en entrée et en retourne de nouvelles. Mais ne modifie aucun état global, ni aucun de ses arguments.
  • 11. Kesako ? Comment ? ● Pas de modification des données ○ Pour modifier une donnée, on en crée une nouvelle copie ● Pas d’effet de bord ○ Pas de modification de variables globales ○ Pas d’entrée/sortie
  • 12. Kesako ? struct rect_t { int x, y, width, height; } void move(rect_t *rect, int dx, int dy) { rect->x += dx; rect->y += dy; } struct rect_t { int x, y, width, height; } rect_t move(rect_t rect, int dx, int dy) { return { .x = rect.x + dx, .y = rect.y + dy, .width = rect.width, .height = rect.height }; } Impératif Fonctionnel
  • 13. Kesako ? rect_t my_rectangle() { rect_t rect = { .x = 0, .y = 0, .width = 100, .height = 100 }; move(&rect, 10, 10); return rect; } rect_t my_rectangle() { rect_t rect = { .x = 0, .y = 0, .width = 100, .height = 100 }; return move(rect, 10, 10); } Impératif Fonctionnel
  • 14. Kesako ? ● Les fonctions sont : ○ déterministes ○ plus facilement testables ○ thread-safes ○ plus modulables ○ plus réutilisables ● Code plus facilement lisible ● Moins d’erreurs ● Optimisations ● Performances ○ Mais pas toujours ... ● Pas d’entrées/sorties Avantages Désavantages
  • 15. Récursion ? Impératif Fonctionnel int sum_n(int n) { int sum = 0; for (int i = 1; i <= n; i++) sum += i; return sum; } Modification de variable
  • 16. Récursion int sum_n(int n) { int sum = 0; for (int i = 1; i <= n; i++) sum += i; return sum; } int sum_n(int n) { if (n <= 0) return 0; else return n + sum_n(n - 1); } Impératif Fonctionnel int sum_n(int n) { int sum = 0; for (int i = 1; i <= n; i++) sum += i; return sum; } Modification de variable
  • 17. Plan ● Kesako ? ● Haskell ○ “An advanced purely-functional programming language” ● Stuff ● Real world stuff ● Aller plus loin
  • 18. Haskell - Syntaxe -- Tous les opérateurs sont des fonctions (+) :: Int -> Int -> Int -- Les fonctions sont des valeurs add :: Int -> Int -> Int add = + -- Une fonction a 2 arguments est une -- fonction à 1 argument qui retourne -- une fonction à 1 argument ! next :: Int -> Int next = add 1 -- Ou directement next = + 1 two = next 1 -- Equivalent à “add 1 1” pi :: Double pi = 3.1416 square :: Int -> Int square x = x * x -- Pas de parenthèse pour les appels de -- fonctions four :: Int four = square 2 -- Pattern matching isFive 5 = True isFive x = False -- Récursion sumN n = if n <= 0 then 0 else n + sumN (n - 1)
  • 19. Haskell - Listes -- Liste vide empty :: [Int] empty = [] -- ":" permet d'ajouter un élément au début de la liste (:) :: Int -> [Int] -> [Int] one :: [Int] one = 1 : empty xs :: [Int] xs = 1 : 2 : 3 : 4 : 5 : [] -- Equivalent à : xs = [ 1, 2, 3, 4, 5 ] -- Pattern matching sur ":" et "[]" length :: [Int] -> Int length [] = 0 length (y : ys) = 1 + length ys -- Concaténation de deux listes avec "++" (++) :: [Int] -> [Int] -> [Int] [] ++ zs = zs (y : ys) ++ zs = y : (ys ++ zs) -- Donne les premiers éléments d'une liste take n [] = [] take 0 ys = [] take n (y : ys) = y : take (n - 1) ys xs = : 1 2: 3: 4: 5: []
  • 20. Plan ● Kesako ? ● Haskell ○ “An advanced purely-functional programming language” ● Stuff ● Real world stuff ● Aller plus loin
  • 21. Stuff - Higher-order functions -- Les fonctions peuvent elles-mêmes -- recevoir des fonctions en argument : map :: (Int -> Int) -> [Int] -> [Int] map f [] = [] map f (x : xs) = f x : map f xs filter :: (Int -> Bool) -> [Int] -> [Int] filter p [] = [] filter p (x : xs) = if p x then x : filter p xs else filter p xs >>> map square [ 1, 2, 3, 4, 5 ] [ 1, 4, 9, 16, 25 ] >>> filter (> 3) [ 10, 2, 3, 5, 0, 7 ] [ 10, 5, 7 ]
  • 22. Stuff - Quick Sort ! qsort [ 5, 2, 3, 10, 0, 7 ] qsort [ 2, 3, 0 ] ++ [ 5 ] ++ qsort [ 7, 10 ] qsort [ 0 ] ++ [ 2 ] ++ qsort [ 3 ] qsort [] ++ [ 7 ] ++ qsort [ 10 ] [] ++ [ 0 ] ++ [] [] ++ [ 3 ] ++ [] [] ++ [ 10 ] ++ []
  • 23. qsort [ 5, 2, 3, 10, 0, 7 ] qsort [ 2, 3, 0 ] ++ [ 5 ] ++ qsort [ 7, 10 ] qsort [ 0 ] ++ [ 2 ] ++ qsort [ 3 ] qsort [] ++ [ 5 ] ++ qsort [ 10 ] [] ++ [ 0 ] ++ [] [] ++ [ 3 ] ++ [] [] ++ [ 10 ] ++ [] Stuff - Quick Sort ! qsort :: [Int] -> [Int] qsort [] = [] qsort (x : xs) = qsort lesser ++ [ x ] ++ qsort greater where lesser = filter (<= x) xs greater = filter (> x) xs
  • 24. Stuff - Quick Sort ! >>> qsort oneMillion 5.05 secs
  • 25. Stuff - Quick Sort ! >>> qsort oneMillion 5.05 secs >>> take 100 (qsort oneMillion)
  • 26. Stuff - Haskell is lazy >>> qsort oneMillion 5.05 secs >>> take 100 (qsort oneMillion) 0.48 secs WTF ?!!?
  • 27. Stuff - Haskell is lazy ● Haskell est un langage à évaluation « paresseuse » ○ Une donnée calculée que lorsqu’elle est accèdée pour la première fois ● Chaque noeud d’une liste est une donnée : 1 2: []
  • 28. Stuff - Haskell is lazy take 3 (qsort [ 5, 2, 3, 10, 0, 7 ]) qsort [ 2, 3, 0 ] ++ [ 5 ] ++ qsort [ 7, 10 ] qsort [ 0 ] ++ [ 2 ] ++ qsort [ 3 ] qsort [] ++ [ 5 ] ++ qsort [ 10 ] [] ++ [ 0 ] ++ [] [] ++ [ 3 ] ++ [] [] ++ [ 10 ] ++ [] ● Haskell est un langage à évaluation « paresseuse » ○ Une donnée calculée que lorsqu’elle est accèdée pour la première fois ● Chaque noeud d’une liste est une donnée : 1 2: []
  • 29. Plan ● Kesako ? ● Haskell ○ “An advanced purely-functional programming language” ● Stuff ● Real world stuff ● Aller plus loin
  • 30. Real world stuff - Entrées sorties IO Fonctionnel
  • 31. Real world stuff - Entrées et sorties -- Les fonctions ayant des effets de bords retournent “ IO a ”, -- où “ a ” est la valeur retournée. -- “ () ” est l'équivalent de “ void ”. putStrLn :: Text -> IO () readFile :: FilePath -> IO Text writeFile :: FilePath -> Text -> IO () getArgs :: IO [Text]
  • 32. Real world stuff - Entrées et sorties -- “ do ” permet de séquencer des fonctions à effets de bord -- comme dans un langage impératif. -- “ <- ” permet de récupérer le résutat d’une “ IO ”. main :: IO () main = do [ path ] <- getArgs c <- readFile path putStrLn c
  • 33. Real world stuff - Grep $ grep "Maître" le_corbeau_et_le_renard.txt Maître Corbeau, sur un arbre perché, Maître Renard, par l’odeur alléché,
  • 34. Real world stuff - Grep lines :: Text -> [Text] unlines :: [Text] -> Text isInfixOf :: Text -> Text -> Bool grep :: Text -> Text -> Text grep pattern text = unlines matches where ls = lines text matches = filter (isInfixOf pattern) ls main = do [pattern, path] <- getArgs text <- readFile path putStrLn (grep pattern text)
  • 35. Real world stuff - Grep $ du -h de_bello_gallico.txt 144K de_bello_gallico.txt $ grep "Belg" de_bello_gallico.txt [ 26 lignes ... ] 0.003 secs (1 868 870 cycles CPU) $ ./GrepHS "Belg" de_bello_gallico.txt [ 26 lignes ... ] 0.008 secs (6 603 153 cycles CPU, GC : 1.4%) - Mem. max. : 1 MB
  • 36. Real world stuff - Grep $ du -h de_bello_gallico_large.txt 141M de_bello_gallico_large.txt $ grep "Belg" de_bello_gallico_large.txt [ 26 000 lignes ... ] 0.0988 secs (326 516 484 cycles CPU) $ ./GrepHS "Belg" de_bello_gallico_large.txt [ 26 000 lignes ... ] 1.632 secs (5 973 858 671 cycles CPU, GC : 0.5 %) - Mem. max. : 1 MB
  • 37. Real world stuff - Haskell lazy again ! $ du -h de_bello_gallico_large.txt 141M de_bello_gallico_large.txt $ grep "Belg" de_bello_gallico_large.txt [ 26 000 lignes ... ] 0.0988 secs (326 516 484 cycles CPU) $ ./GrepHS "Belg" de_bello_gallico_large.txt [ 26 000 lignes ... ] 1.632 secs (5 973 858 671 cycles CPU, GC : 0.5 %) - Mem. max. : 1 MB WTF ?!!?? text <- readFile path putStrLn (grep pattern text)
  • 38. Real world stuff - Haskell lazy again ! text = [] : alléchénLui tint à peu près ce langage :n"Hé ! bonjour, Monsieur du Corbeau.nQue vous êtes joli : êtes le Phenix des hôtes de ces bois.nÀ ces mots le Corbeau ne se sent pas de joie :nEt pour montrer : ! que vous me semblez beau !nSans mentir, si votre ramagenSe rapporte à votre plumage,nVous : sa belle voix,nIl ouvre un large bec, laisse tomber sa proie.nLe Renard s’en saisit, et dit : Mon bon : un fromage sans doute.nLe Corbeau honteux et confusnJura, qu’on ne l’y prendrait plus. : Monsieur,nApprenez que tout flatteurnVit aux dépens de celui qui l’écoute.nCette leçon vaut bien Maître Corbeau sur un arbre perché,nTenait en son bec un fromage.nMaître Renard par l’odeur:
  • 39. Plan ● Kesako ? ● Haskell ○ “An advanced purely-functional programming language” ● Stuff ● Real world stuff ● Aller plus loin
  • 40. Aller plus loin - Pourquoi ? ● Programmer ... ○ … plus modulable ○ … plus réutilisable ○ … plus rigoureusement ● Monstrueusement efficace pour ... ○ … la programmation parallèle et concurrente ○ … le backend et les réseaux ● De plus en plus de langages tendent vers le paradigme
  • 41. Aller plus loin - Langages Fonctionnel O rienté objet Im pératif LISPs
  • 42. Aller plus loin - Langages Fonctionnel O rienté objet Im pératif LISPs Microsoft .NET Java VM Réseaux et haute disponibilité Très bas niveau
  • 43. Aller plus loin - Langages Fonctionnel O rienté objet Im pératif LISPs
  • 44.
  • 45. Moyenne sur 13 benchmarks Source : http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.html
  • 46. Benchmark des context-switchs. Source : http://benchmarksgame.alioth.debian.org/u64q/performance.php?test=threadring