Programmation fonctionnelle et Haskell for dummies

8 oct. 2013 - Programmation fonctionnelle et Haskell for dummies. INFO1 - Semaine 41. Guillaume CONNAN. IUT de Nantes - Dpt d'informatique. Dernière ...
1MB taille 5 téléchargements 394 vues
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