page.1
Programmation fonctionnelle et Haskell for dummies INFO1 - Semaine 41 Guillaume CONNAN IUT de Nantes - Dpt d’informatique
Dernière mise à jour : 8 octobre 2013 à 12:09
(IUT de Nantes - Dpt d’informatique )
1 / 68
page.2
Sommaire
1 2 3
Born to be lazy Les fonctions Curryfication
(IUT de Nantes - Dpt d’informatique )
4
Un exemple
5
Polymorphisme - abstraction - récursion listes
2 / 68
page.3
Born to be lazy
Sommaire
1 2 3
Born to be lazy Les fonctions Curryfication
(IUT de Nantes - Dpt d’informatique )
4
Un exemple
5
Polymorphisme - abstraction - récursion listes
3 / 68
page.4
Born to be lazy
En C #include int
somme(int,int);
void main(void) { int s,a,b; printf("Entrez la valeur du plus petit entier: "); scanf("%d" , &a); printf("Entrez la valeur du plus grand entier: "); scanf("%d" , &b); s = somme(a,b); printf("La somme des entiers de %d à %d est %d \n", a,b,s); }
int somme(int a, int { int tmp; int som;
b)
tmp = a; som = a; while (tmp != b) { tmp = tmp + 1; som = som + tmp;} return som; } (IUT de Nantes - Dpt d’informatique )
4 / 68
page.5
Born to be lazy
$ gcc -o somme poly_haskell.c $ ./somme Entrez la valeur du plus petit entier: 1 Entrez la valeur du plus grand entier: 10 La somme des entiers de 1 à 10 est 55
Que s’est-il passé ? A t-on ce que l’on désirait ?
(IUT de Nantes - Dpt d’informatique )
5 / 68
page.6
Born to be lazy
$ gcc -o somme poly_haskell.c $ ./somme Entrez la valeur du plus petit entier: 1 Entrez la valeur du plus grand entier: 10 La somme des entiers de 1 à 10 est 55
Que s’est-il passé ? A t-on ce que l’on désirait ?
(IUT de Nantes - Dpt d’informatique )
5 / 68
page.7
Born to be lazy
$ gcc -o somme poly_haskell.c $ ./somme Entrez la valeur du plus petit entier: 1 Entrez la valeur du plus grand entier: 10 La somme des entiers de 1 à 10 est 55
Que s’est-il passé ? A t-on ce que l’on désirait ?
(IUT de Nantes - Dpt d’informatique )
5 / 68
page.8
Born to be lazy
Avec Haskell
somme a b =
foldl (+) 0 [a..b]
*Main> somme 1 10 55 *Main> 55
sum [1..10]
(IUT de Nantes - Dpt d’informatique )
6 / 68
page.9
Born to be lazy
Avec Haskell
somme a b =
foldl (+) 0 [a..b]
*Main> somme 1 10 55 *Main> 55
sum [1..10]
(IUT de Nantes - Dpt d’informatique )
6 / 68
page.10
Born to be lazy
Avec Haskell
somme a b =
foldl (+) 0 [a..b]
*Main> somme 1 10 55 *Main> 55
sum [1..10]
(IUT de Nantes - Dpt d’informatique )
6 / 68
page.11
somme_fonction f a b =
Born to be lazy
foldl (\accu x -> accu + f(x)) 0 [a..b]
*Main> somme_fonction (\x -> x^2) 1 10 385
(IUT de Nantes - Dpt d’informatique )
7 / 68
page.12
somme_fonction f a b =
Born to be lazy
foldl (\accu x -> accu + f(x)) 0 [a..b]
*Main> somme_fonction (\x -> x^2) 1 10 385
(IUT de Nantes - Dpt d’informatique )
7 / 68
page.13
Born to be lazy
Calculez la somme des carrés impairs inférieurs à 1000 ? En C ? sum (takeWhile ( (double 3) + (double 7) 20
(IUT de Nantes - Dpt d’informatique )
13 / 68
page.24
Les fonctions
Utiliser
UTILISER a fonction dans une expression en lui donnant des paramètres effectifs (arguments), c’est-à-dire liés à l’application particulière de la fonction : *Main> (double 3) + (double 7) 20
(IUT de Nantes - Dpt d’informatique )
13 / 68
page.25
Curryfication
Sommaire
1 2 3
Born to be lazy Les fonctions Curryfication
(IUT de Nantes - Dpt d’informatique )
4
Un exemple
5
Polymorphisme - abstraction - récursion listes
14 / 68
page.26
Curryfication
Haskell Curry (1900 - 1982)
(IUT de Nantes - Dpt d’informatique )
15 / 68
page.27
(IUT de Nantes - Dpt d’informatique )
Curryfication
16 / 68
page.28
Curryfication
Une fonction curryfiée est une fonction de plusieurs variables transformée en une fonction d’une seule variable qui renvoie une fonction ayant une variable de moins... Cela permet de créer des fonctions partielles.
(IUT de Nantes - Dpt d’informatique )
17 / 68
page.29
Curryfication
Une fonction curryfiée est une fonction de plusieurs variables transformée en une fonction d’une seule variable qui renvoie une fonction ayant une variable de moins... Cela permet de créer des fonctions partielles.
(IUT de Nantes - Dpt d’informatique )
17 / 68
page.30
Curryfication
plus x y = x + y plus :: Integer -> Integer -> Integer plus x y = x + y
Associativité f = plus 3
Que vaut f(5) ? *Main> f 5 8 *Main> :t f f :: Integer ->
Integer
(IUT de Nantes - Dpt d’informatique )
18 / 68
page.31
Curryfication
plus x y = x + y plus :: Integer -> Integer -> Integer plus x y = x + y
Associativité f = plus 3
Que vaut f(5) ? *Main> f 5 8 *Main> :t f f :: Integer ->
Integer
(IUT de Nantes - Dpt d’informatique )
18 / 68
page.32
Curryfication
plus x y = x + y plus :: Integer -> Integer -> Integer plus x y = x + y
Associativité f = plus 3
Que vaut f(5) ? *Main> f 5 8 *Main> :t f f :: Integer ->
Integer
(IUT de Nantes - Dpt d’informatique )
18 / 68
page.33
Curryfication
plus x y = x + y plus :: Integer -> Integer -> Integer plus x y = x + y
Associativité f = plus 3
Que vaut f(5) ? *Main> f 5 8 *Main> :t f f :: Integer ->
Integer
(IUT de Nantes - Dpt d’informatique )
18 / 68
page.34
Curryfication
plus x y = x + y plus :: Integer -> Integer -> Integer plus x y = x + y
Associativité f = plus 3
Que vaut f(5) ? *Main> f 5 8 *Main> :t f f :: Integer ->
Integer
(IUT de Nantes - Dpt d’informatique )
18 / 68
page.35
Curryfication
plus x y = x + y plus :: Integer -> Integer -> Integer plus x y = x + y
Associativité f = plus 3
Que vaut f(5) ? *Main> f 5 8 *Main> :t f f :: Integer ->
Integer
(IUT de Nantes - Dpt d’informatique )
18 / 68
page.36
Curryfication
plus x y = x + y plus :: Integer -> Integer -> Integer plus x y = x + y
Associativité f = plus 3
Que vaut f(5) ? *Main> f 5 8 *Main> :t f f :: Integer ->
Integer
(IUT de Nantes - Dpt d’informatique )
18 / 68
page.37
Curryfication
F(D , A) ¡ ¢ plus ∈ F N, F(N, N)
(IUT de Nantes - Dpt d’informatique )
19 / 68
page.38
Curryfication
F(D , A) ¡ ¢ plus ∈ F N, F(N, N)
(IUT de Nantes - Dpt d’informatique )
19 / 68
page.39
Un exemple
Sommaire
1 2 3
Born to be lazy Les fonctions Curryfication
(IUT de Nantes - Dpt d’informatique )
4
Un exemple
5
Polymorphisme - abstraction - récursion listes
20 / 68
page.40
Un exemple
Exemple 1 Décrire une fonction qui étant donnés quatre flottants leur associe la moyenne des deux nombres parmi les quatre qui ne sont ni le plus grand ni le plus petit. Par exemple, la moyenne olympique de 10, 8, 12 et 14 est 11 et celle de 12, 12, 12 et 12 est 12.
(IUT de Nantes - Dpt d’informatique )
21 / 68
page.41
Un exemple
Spécification
moyenne_olympique4 ::
Float -> Float -> Float -> Float -> Float
−− r e n v o i e l a moyenne olympique de 4 f l o t t a n t s s o u s forme d ’ un
flottant
(IUT de Nantes - Dpt d’informatique )
22 / 68
page.42
Un exemple
Réalisation Nous allons par exemple additionner les quatre nombres, retirer le plus grand et le plus petit puis diviser par 2. *Main> :t min min :: Ord a => a -> a -> a *Main> min ’a’ ’b’ ’a’ *Main> min 5 3 3 *Main> min "Tralala" "Pouet Pouet" "Pouet Pouet" *Main> min True False
False
(IUT de Nantes - Dpt d’informatique )
23 / 68
page.43
Un exemple
Réalisation Nous allons par exemple additionner les quatre nombres, retirer le plus grand et le plus petit puis diviser par 2. *Main> :t min min :: Ord a => a -> a -> a *Main> min ’a’ ’b’ ’a’ *Main> min 5 3 3 *Main> min "Tralala" "Pouet Pouet" "Pouet Pouet" *Main> min True False
False
(IUT de Nantes - Dpt d’informatique )
23 / 68
page.44
Un exemple
Réalisation Nous allons par exemple additionner les quatre nombres, retirer le plus grand et le plus petit puis diviser par 2. *Main> :t min min :: Ord a => a -> a -> a *Main> min ’a’ ’b’ ’a’ *Main> min 5 3 3 *Main> min "Tralala" "Pouet Pouet" "Pouet Pouet" *Main> min True False
False
(IUT de Nantes - Dpt d’informatique )
23 / 68
page.45
Un exemple
Réalisation
moyenne_olympique4 a b c d = (s - mini - maxi) / 2 −− l ’ e x p r e s s i o n c o r r e s p o n d a n t à l a mé thode choisie where s = a + b + c + d −− l a somme des 4 nombres mini = min a (min b (min c d) ) −− l e p l u s p e t i t des 4 maxi = max a (max b (max c d) ) −− l e p l u s grand des 4 *Main> moyenne_olympique4 10 8 12 14 11.0
(IUT de Nantes - Dpt d’informatique )
24 / 68
page.46
Un exemple
Réalisation
moyenne_olympique4 a b c d = (s - mini - maxi) / 2 −− l ’ e x p r e s s i o n c o r r e s p o n d a n t à l a mé thode choisie where s = a + b + c + d −− l a somme des 4 nombres mini = min a (min b (min c d) ) −− l e p l u s p e t i t des 4 maxi = max a (max b (max c d) ) −− l e p l u s grand des 4 *Main> moyenne_olympique4 10 8 12 14 11.0
(IUT de Nantes - Dpt d’informatique )
24 / 68
page.47 Polymorphisme - abstraction - récursion - listes
Sommaire
1 2 3
Born to be lazy Les fonctions Curryfication
(IUT de Nantes - Dpt d’informatique )
4
Un exemple
5
Polymorphisme - abstraction - récursion listes
25 / 68
page.48 Polymorphisme - abstraction - récursion - listes
Exemple 2 Décrire une fonction qui étant donnée une liste d’au moins quatre nombres leur associe la moyenne des nombres parmi ceux de la liste qui ne sont ni le plus grand ni le plus petit. Par exemple, la moyenne olympique de 15, 7, 10, 8, 12 et 14 est 11.
(IUT de Nantes - Dpt d’informatique )
26 / 68
page.49 Polymorphisme - abstraction - récursion - listes
Min et Max polymorphes
min_liste :: (Ord a) => [a] -> a −− r e n v o i e l e m i n i d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
max_liste :: (Ord a) => [a] -> a −− r e n v o i e l e maxi d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
extr_liste :: (Ord a) => (a -> a -> a) -> [a] -> a −− r e n v o i e l e m i n i ou l e maxi ( on c h o i s i t en mettant l a n a t u r e de l ’
extremum en param è t r e ) d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
(IUT de Nantes - Dpt d’informatique )
27 / 68
page.50 Polymorphisme - abstraction - récursion - listes
Min et Max polymorphes
min_liste :: (Ord a) => [a] -> a −− r e n v o i e l e m i n i d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
max_liste :: (Ord a) => [a] -> a −− r e n v o i e l e maxi d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
extr_liste :: (Ord a) => (a -> a -> a) -> [a] -> a −− r e n v o i e l e m i n i ou l e maxi ( on c h o i s i t en mettant l a n a t u r e de l ’
extremum en param è t r e ) d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
(IUT de Nantes - Dpt d’informatique )
27 / 68
page.51 Polymorphisme - abstraction - récursion - listes
Min et Max polymorphes
min_liste :: (Ord a) => [a] -> a −− r e n v o i e l e m i n i d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
max_liste :: (Ord a) => [a] -> a −− r e n v o i e l e maxi d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
extr_liste :: (Ord a) => (a -> a -> a) -> [a] -> a −− r e n v o i e l e m i n i ou l e maxi ( on c h o i s i t en mettant l a n a t u r e de l ’
extremum en param è t r e ) d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
(IUT de Nantes - Dpt d’informatique )
27 / 68
page.52 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
28 / 68
page.53 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Récursion, induction, récurrence
29 / 68
page.54 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Récursion, induction, récurrence
30 / 68
page.55 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Récursion, induction, récurrence
31 / 68
page.56 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Récursion, induction, récurrence
32 / 68
page.57 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Récursion, induction, récurrence
33 / 68
page.58 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Récursion, induction, récurrence
34 / 68
page.59 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Récursion, induction, récurrence
35 / 68
page.60 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Récursion, induction, récurrence
36 / 68
page.61 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Récursion, induction, récurrence
37 / 68
page.62 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Récursion, induction, récurrence
38 / 68
page.63 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Récursion, induction, récurrence
39 / 68
page.64 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Récursion, induction, récurrence
40 / 68
page.65 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Récursion, induction, récurrence
41 / 68
page.66 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Récursion, induction, récurrence
42 / 68
page.67 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Récursion, induction, récurrence
43 / 68
page.68 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Récursion, induction, récurrence
44 / 68
page.69 Polymorphisme - abstraction - récursion - listes
Récursion, induction, récurrence
induction induction mathématique (raisonnement par récurrence) fonction récurive et type récursif
(IUT de Nantes - Dpt d’informatique )
45 / 68
page.70 Polymorphisme - abstraction - récursion - listes
Récursion, induction, récurrence
induction induction mathématique (raisonnement par récurrence) fonction récurive et type récursif
(IUT de Nantes - Dpt d’informatique )
45 / 68
page.71 Polymorphisme - abstraction - récursion - listes
Récursion, induction, récurrence
induction induction mathématique (raisonnement par récurrence) fonction récurive et type récursif
(IUT de Nantes - Dpt d’informatique )
45 / 68
page.72 Polymorphisme - abstraction - récursion - listes
Récursion, induction, récurrence
Factorielle
n! = 1× 2 × 3 × · · · × n n! =
1 si n=0 n × (n − 1)! si n Ê 1
fac(n): si n = 0 alors 1 sinon n * (fac (n - 1)) fac(n): si n = 0 alors 1 sinon (fac (n + 1)) / (n + 1)
(IUT de Nantes - Dpt d’informatique )
46 / 68
page.73 Polymorphisme - abstraction - récursion - listes
Récursion, induction, récurrence
Factorielle
n! = 1×2×3×···×n n! =
1 si n=0 n × (n − 1)! si n Ê 1
fac(n): si n = 0 alors 1 sinon n * (fac (n - 1)) fac(n): si n = 0 alors 1 sinon (fac (n + 1)) / (n + 1)
(IUT de Nantes - Dpt d’informatique )
46 / 68
page.74 Polymorphisme - abstraction - récursion - listes
Récursion, induction, récurrence
Factorielle
n! = 1×2×3×···×n n! =
1 si n=0 n × (n − 1)! si n Ê 1
fac(n): si n = 0 alors 1 sinon n * (fac (n - 1)) fac(n): si n = 0 alors 1 sinon (fac (n + 1)) / (n + 1)
(IUT de Nantes - Dpt d’informatique )
46 / 68
page.75 Polymorphisme - abstraction - récursion - listes
Récursion, induction, récurrence
Factorielle
n! = 1×2×3×···×n n! =
1 si n=0 n × (n − 1)! si n Ê 1
fac(n): si n = 0 alors 1 sinon n * (fac (n - 1)) fac(n): si n = 0 alors 1 sinon (fac (n + 1)) / (n + 1)
(IUT de Nantes - Dpt d’informatique )
46 / 68
page.76 Polymorphisme - abstraction - récursion - listes
Récursion, induction, récurrence
Factorielle
fac1 :: Integer -> Integer fac1 0 = 1 fac1 n = n * (fac (n-1)) *Main> fac1 100 933262154439441526816992388562667004907159682643816214685929638952175 999932299156089414639761565182862536979208272237582511852109168640000 00000000000000000000
(IUT de Nantes - Dpt d’informatique )
47 / 68
page.77 Polymorphisme - abstraction - récursion - listes
Récursion, induction, récurrence
Factorielle
fac1 :: Integer -> Integer fac1 0 = 1 fac1 n = n * (fac (n-1)) *Main> fac1 100 933262154439441526816992388562667004907159682643816214685929638952175 999932299156089414639761565182862536979208272237582511852109168640000 00000000000000000000
(IUT de Nantes - Dpt d’informatique )
47 / 68
page.78 Polymorphisme - abstraction - récursion - listes
Récursion, induction, récurrence
Factorielle
fac2 n = fac_boucle n 1
where fac_boucle 0 accu = accu fac_boucle k accu = fac_boucle (k - 1) (k * accu)
(IUT de Nantes - Dpt d’informatique )
48 / 68
page.79 Polymorphisme - abstraction - récursion - listes
Récursion, induction, récurrence
Factorielle
fac3 :: Integer -> Integer fac3 n = foldl (*) 1 [1..n]
(IUT de Nantes - Dpt d’informatique )
49 / 68
page.80 Polymorphisme - abstraction - récursion - listes
Récursion, induction, récurrence
Factorielle
fac4 :: Integer -> Integer fac4 n = product [1..n]
(IUT de Nantes - Dpt d’informatique )
50 / 68
page.81 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Qu’est-ce qu’un mot ?
(IUT de Nantes - Dpt d’informatique )
51 / 68
page.82 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
« glop » :+ :+
g
:+
l
:+
o p
(IUT de Nantes - Dpt d’informatique )
Vide
52 / 68
page.83 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
« glop » :+ :+
g
:+
l
:+
o p
(IUT de Nantes - Dpt d’informatique )
Vide
52 / 68
page.84 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
infixr :+ data Mot = Vide | Char :+ Mot
(IUT de Nantes - Dpt d’informatique )
53 / 68
page.85 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
infixr :+ data Mot = Vide | Char :+ Mot deriving (Show)
(IUT de Nantes - Dpt d’informatique )
54 / 68
page.86 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
infixr :+ data Mot = Vide | Char :+ Mot deriving (Show,
Eq)
(IUT de Nantes - Dpt d’informatique )
55 / 68
page.87 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
*Main> let m = ’g’ :+ ’l’ :+ ’o’ :+ ’p’ :+ Vide *Main> m ’g’ :+ (’l’ :+ (’o’ :+ (’p’ :+ Vide))) *Main> :t m m :: Mot
(IUT de Nantes - Dpt d’informatique )
56 / 68
page.88 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
*Main> let m = ’g’ :+ ’l’ :+ ’o’ :+ ’p’ :+ Vide *Main> m ’g’ :+ (’l’ :+ (’o’ :+ (’p’ :+ Vide))) *Main> :t m m :: Mot
(IUT de Nantes - Dpt d’informatique )
56 / 68
page.89 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Sélecteurs
tete :: Mot
->
Char
−− r e n v o i e l e p r e m i e r c a r a c t è r e d ’ un mot avec un f i l t r a g e p a r m o t i f
tete Vide = tete (t :+ q) =
error "Mot vide !" t
*Main> tete m ’g’
Et la queue ?
(IUT de Nantes - Dpt d’informatique )
57 / 68
page.90 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Sélecteurs
tete :: Mot
->
Char
−− r e n v o i e l e p r e m i e r c a r a c t è r e d ’ un mot avec un f i l t r a g e p a r m o t i f
tete Vide = tete (t :+ q) =
error "Mot vide !" t
*Main> tete m ’g’
Et la queue ?
(IUT de Nantes - Dpt d’informatique )
57 / 68
page.91 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Sélecteurs
tete :: Mot
->
Char
−− r e n v o i e l e p r e m i e r c a r a c t è r e d ’ un mot avec un f i l t r a g e p a r m o t i f
tete Vide = tete (t :+ q) =
error "Mot vide !" t
*Main> tete m ’g’
Et la queue ?
(IUT de Nantes - Dpt d’informatique )
57 / 68
page.92 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Testeurs
estVide :: Mot -> Bool estVide m = m == Vide
¡ ¢ ¬(estVide m) ↔ m = (tete m) :+ (queue m)
(IUT de Nantes - Dpt d’informatique )
58 / 68
page.93 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Testeurs
estVide :: Mot -> Bool estVide m = m == Vide
¡ ¢ ¬(estVide m) ↔ m = (tete m) :+ (queue m)
(IUT de Nantes - Dpt d’informatique )
58 / 68
page.94 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Construire une fonction définie sur un type récursif
On voudrait compter le nombre de « a » dans un mot. nba :: Mot -> Int l e nombre de ’ a ’ dans un mot
−− c a l c u l e
(IUT de Nantes - Dpt d’informatique )
59 / 68
page.95 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Construire une fonction définie sur un type récursif
On voudrait compter le nombre de « a » dans un mot. nba :: Mot -> Int l e nombre de ’ a ’ dans un mot
−− c a l c u l e
(IUT de Nantes - Dpt d’informatique )
59 / 68
page.96 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Si le mot est vide, alors son nombre de ’a’ est 0. Sinon, le mot est construit par t :+ q. Si t = 0 a0 , alors nba mot = 1 + nba q, sinon, nba mot = nba q. nba Vide = 0 nba (t :+ q) = (nba q) + (if t == ’a’
(IUT de Nantes - Dpt d’informatique )
then 1 else 0)
60 / 68
page.97 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Si le mot est vide, alors son nombre de ’a’ est 0. Sinon, le mot est construit par t :+ q. Si t = 0 a0 , alors nba mot = 1 + nba q, sinon, nba mot = nba q. nba Vide = 0 nba (t :+ q) = (nba q) + (if t == ’a’
(IUT de Nantes - Dpt d’informatique )
then 1 else 0)
60 / 68
page.98 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Filtrage par motif
nba2 Vide = 0 nba2 (t :+ q) | t == ’a’ = (nba2 q) + 1 |otherwise = nba2 q
(IUT de Nantes - Dpt d’informatique )
61 / 68
page.99 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Case
nba3 mot =
case mot of Vide
(IUT de Nantes - Dpt d’informatique )
-> 0 (t :+ q) -> (nba3 q) + (if t == ’a’ else 0)
then 1
62 / 68
page.100 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Pliage
:
f :
1
:
2
4
f 3
f :
3 4
(IUT de Nantes - Dpt d’informatique )
2
f Vide
ini
1
63 / 68
page.101 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Pliage
nba4 :: Mot -> Int l e nombre de ’ a ’ dans un mot p a r p l i a g e nba4 mot = pliage (\accu t -> accu + (if t == ’a’ then 1 else 0)) 0 mot
−− c a l c u l e
(IUT de Nantes - Dpt d’informatique )
64 / 68
page.102 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Pliage
pliage :: (a ->
Char -> a) -> a -> Mot -> a
−− adapte f o l d l aux mots
pliage fonc ini Vide = ini pliage fonc ini (t :+ q) = pliage fonc (fonc ini t) q
(IUT de Nantes - Dpt d’informatique )
65 / 68
page.103 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Applique
Mettre en majuscule. *Main> import Data.Char *Main Data.Char> toUpper ’g’ ’G’
(IUT de Nantes - Dpt d’informatique )
66 / 68
page.104 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
Applique
Mettre en majuscule. *Main> import Data.Char *Main Data.Char> toUpper ’g’ ’G’
(IUT de Nantes - Dpt d’informatique )
66 / 68
page.105 Polymorphisme - abstraction - récursion - listes
Définition récursive d’un type
glop -> GLOP ?
(IUT de Nantes - Dpt d’informatique )
67 / 68
page.106 Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique )
Définition récursive d’un type
68 / 68