Programmation fonctionnelle / Haskell
Cl´
ement Delafargue
15 octobre 2012
Slide 2
Slide 2 text
Section 1
Contexte
Slide 3
Slide 3 text
Une profusion de langages
Il existe beaucoup de langages de programmation
Des c´
el`
ebres (C, Java)
D’autres moins (J)
Pourquoi cette profusion ?
Slide 4
Slide 4 text
Diff´
erents paradigmes
Quelques paradigmes de programmation :
Imp´
eratif
Fonctionnel
Logique
Slide 5
Slide 5 text
Le paradigme imp´
eratif
Remonte `
a la machine de Turing
Manutention d’espace m´
emoire
Proche du fonctionnment des processeurs
Slide 6
Slide 6 text
Le paradigme fonctionnel
Remonte au Lambda Calcul
D´
efinition de fonctions et de leur combinaisons
Proche des math´
ematiques
Slide 7
Slide 7 text
Le paradigme fonctionnel
Pas d’instructions, mais des donn´
ees et leurs relations
Slide 8
Slide 8 text
Pourquoi le fonctionnel ?
Raisonnement simplifi´
e
D´
ebogage ais´
e
Tests unitaires plus simples
Concurrence
Garanties fortes
Slide 9
Slide 9 text
Section 2
La programmation fonctionnelle
Slide 10
Slide 10 text
L’essence de la programmation fonctionnelle
Des fonctions
Leur composition
Slide 11
Slide 11 text
L’immutabilit´
e
D´
efinition math´
ematique d’une variable
Immutabilit´
e
Slide 12
Slide 12 text
La “transparence r´
ef´
erentielle”
Une expression d´
enote toujours la meme chose, ind´
ependamment
du contexte.
Terme pas toujours employ´
e correctement.
En r´
ealit´
e : “Absence d’effets de bord”
Slide 13
Slide 13 text
La r´
ecursion
Fondamental
Comment repr´
esenter une boucle sans la mutabilit´
e ?
Approche math´
ematique
x^0 = 1
x^n = x * x^(n-1)
Insiste sur la d´
ecomposition du probl`
eme
Slide 14
Slide 14 text
La programmation fonctionnelle typ´
ee
Chaque valeur a un type (Entier, Bool´
een, Liste d’entiers, Fonction
des entiers vers les Bool´
eens)
Syst`
emes de types souvent sophistiqu´
es
Slide 15
Slide 15 text
Correspondance de Curry Howard
Correspondance preuve - programme.
type <=> proposition
programme bien typ´
e <=> preuve de la proposition
Fondamental
Slide 16
Slide 16 text
Un langage fonctionnel
Permet la manipulation de fonctions
Encourage l’immutabilit´
e
Slide 17
Slide 17 text
Saines lectures
Pour mieux comprendre pourquoi la FP est int´
eressante
FP for the rest of us
Why FP matters
La r´
ef´
erence :
Structure and Interpretation of Computer Programs
Slide 18
Slide 18 text
Section 3
Un langage fonctionnel, Haskell
Slide 19
Slide 19 text
Un langage fonctionnel, Haskell
Haskell (nomm´
e en hommage `
a Haskell Curry)
Premi`
ere version en 1990 (un an avant python) “Design by
committee” (entre autres : Simon Peyton Jones, John Hughes,
Philip Wadler)
Slide 20
Slide 20 text
Les caract´
eristiques de Haskell
Haskell est un langage :
Fonctionnel
Statiquement typ´
e
“Fortement” typ´
e
`
A inf´
erence de type
Pur
Paresseux
Utilis´
e dans la vraie vie (un peu)
Slide 21
Slide 21 text
En d´
etail :
Typage statique : typage d´
etermin´
e en amont
Typage “fort” : `
a voir
`
A inf´
erence de type : capable de d´
eterminer le type d’une
variable
Pur : pas d’effets de bord
Paresseux : ne calcule un terme que quand (et si) il en a
besoin
Slide 22
Slide 22 text
Les avantages
Haskell est un langage :
Fonctionnel : composablit´
e
Statiquement typ´
e : sˆ
uret´
e
“Fortement” typ´
e : sˆ
uret´
e
`
A inf´
erence de type : concision
Pur : composabilit´
e
Paresseux : composabilit´
e
Slide 23
Slide 23 text
Pourquoi apprendre Haskell ?
Pour le fun
Pour voir ce qu’est un beau langage
Pour les garanties qu’il apporte
Pour la rapidit´
e de d´
eveloppement
Slide 24
Slide 24 text
Qui utilise Haskell ?
Moi
Cette pr´
esentation a ´
et´
e g´
en´
er´
ee par un programme en Haskell
Elle est affich´
ee dans un syst`
eme de fenˆ
etrage en Haskell
Des banques, en interne
Facebook
Des agences de d´
eveloppement
Slide 25
Slide 25 text
Quelques projets en Haskell
pandoc: conversion de documents
xmonad: gestionnaire de fenˆ
etres
Darcs: gestionnaire de versions
Yesod: framework web
Slide 26
Slide 26 text
Quelques exemples
La somme des n premiers nombres premiers
primes = nubBy (\x y -> (gcd x y) > 1) [2..]
sumOfPrimes n = sum $ take n primes
La suite de Fibonacci
fibs = fix ((0:) . scanl (+) 1)
fibs’ = 0 : 1 : zipWith (+) fibs’ (tail fibs’)
Slide 27
Slide 27 text
La syntaxe Haskell
Annotation de type (facultatif)
a :: String
f :: String -> String -> Boolean
(+) :: (Num a) => a -> a -> a
Slide 28
Slide 28 text
La syntaxe Haskell
D´
eclaration de fonction
add2 a = a + 2
isTwo 2 = True
isTwo _ = False
headOr a [] = a
headOr _ (x:_) = x
Slide 29
Slide 29 text
La syntaxe Haskell
Application de fonction
add2 4
isTwo (add2 0)
3 + 3
Application partielle
(+3)
(==0)
Slide 30
Slide 30 text
La syntaxe Haskell
Composition de fonction
isTwo (add2 0)
isTwo . add2 0
Slide 31
Slide 31 text
La syntaxe Haskell
D´
eclaration de variable
let x = 0, y = 2 in x + y
D´
eclaration de fonction interne
foo x = bar (x + 2) where
bar y = y + 5
Slide 32
Slide 32 text
La syntaxe Haskell
List comprehension
[ 2 * x | x <- [1..5]]
Slide 33
Slide 33 text
Exercice
Calculer la somme d’une liste d’entiers.
La version courte
sum = fold (+) 0
Slide 34
Slide 34 text
Comment aboutir `
a la solution
Pour un algorithme r´
ecursif
Exprimer un cas d’arret
Exprimer un pas de r´
eduction
Slide 35
Slide 35 text
Quelques petits exercices
Calculer la somme des entiers naturels multiples de 3 ou 5
inf´
erieurs `
a 1000
Calculer l’inverse d’une liste
Le Fizz Buzz
Slide 36
Slide 36 text
Saines lectures
Learn You a Haskell
Real World Haskell
#haskell sur freenode