Introduction `
a la programmation
fonctionnelle
Notes de cours
Cours 1
20 janvier 2017
Sylvain Conchon
1/1 1
Calendrier
MCC : 2 TP not´
es + 1 Examen
ISemaine 1 : Cours
ISemaine 2 : Cours
ISemaine 3 : TP
ISemaine 4 : TP
ISemaine 5 : Cours
ISemaine 6 : TP
ISemaine 7 : TP
ISemaine 8 : TP not ´
e
ISemaine 9 : Cours
ISemaine 10 : TP
ISemaine 11 : TP
ISemaine 12 : TP not ´
e
http://www.lri.fr/~conchon/IPF/
2/1 2
Qu’est-ce que la programmation fonctionnelle ?
C’est un style de programmation dans lequel :
IOn ´
ecrit des fonctions r´
ecursives plut ˆ
ot que boucles
Q: Peut-on vraiment ´
ecrire des programmes sans boucles ?
IOn passe des fonctions en arguments `
a d’autres fonctions
Q:`
A quoi c¸a peut bien servir ?
IOn peut cr´
eer des fonctions pendant l’ex ´
ecution du
programme
Q: Comment c¸a marche ?
IOn peut d´
efinir des fonctions anonymes
Q: Comment appeler ces fonctions dans un programme ?
ILes fonctions peuvent ˆ
etre polymorphes, c’est-`
a-dire
s’appliquent sans distinction `
a tous les types de donn´
ees
Q: Comment ´
ecrit-on le type d’une telle fonction ?
3/1 3
Structure du cours
Le cours est `
a la fois :
IUne introduction `
alaprogrammation fonctionnelle
IUne initiation au langage OCaml
4/1 4
Un livre qui peut vous aider (Amazon, FNAC, etc.)
http://programmer-avec-ocaml.lri.fr/
HnakV^c8dcX]dcZhiegd[ZhhZjgYÉ^c[dgbVi^fjZ|aÉJc^kZgh^iEVg^h"HjYd^aZchZ^\cZaVegd\gVbbVi^dc
ZiVa\dg^i]b^fjZ VkZX D8Vba# ?ZVc"8]g^hide]Z;^aa^}igZZhi X]ZgX]Zjg Vj 8CGHZi ZchZ^\cVci |aÉwXdaZ
EdaniZX]c^fjZd^aYdccZYZhXdjghYÉVa\dg^i]b^fjZ!Zi|aÉ:CHJabd^aYdccZYZhXdjghYZXdbe^aVi^dc
VkZXD8Vba#IdjhYZjmhdciegd\gVbbZjghD8VbaYZej^heajhYZk^c\iVchZidciYkZadeeYZcdbWgZjm
ad\^X^ZahVkZXXZaVc\V\Z#>ahhdciighVXi^[hYVchaVXdbbjcVji[gVcXde]dcZYZhaVc\V\ZhVeea^XVi^[hZi
dcidg\Vc^hZcigZVjigZhaZh»?djgcZh;gVcXde]dcZhYZhAVc\V\Zh6eea^XVi^[h¼#
JcdjkgV\ZYÉVa\dg^i]b^fjZVkVcXZedjgaZhegeVhhX^Zci^ÒfjZhfj^hZheX^Va^hZciZc^c[dgbVi^fjZ
AVXdccV^hhVcXZYZaÉVa\dg^i]b^fjZYdciaZWjiZhiYZX]d^h^gaÉVa\dg^i]bZaZeajhXdjgiZiaZeajhZ[ÒXVXZZcidjiZX^g"
XdchiVcXZZhiXZfj^Y^hi^c\jZZcegZb^Zga^ZjaZegd\gVbbZjgVkVcXYZXZaj^fj^YWjiZ#8ZidjkgV\ZYÉVa\dg^i]b^fjZ
[dcYVbZciVaZX]d^h^iaZaVc\V\ZYZegd\gVbbVi^dcbdYZgcZD8Vba!eg^hXdbbZbdYaZeVgB^Xgdhd[iedjgXdcXZkd^g
;!VÒcYÉ^c^i^ZgaZaZXiZjg|XZidji^aej^hhVciVaa^VciZmegZhh^k^i!eZg[dgbVcXZZihgZi#
Jca^kgZ^cXdcidjgcVWaZedjgYWjiZgVkZXD8Vba
D8VbaZhiaÉjcYZh[ZghYZaVcXZYZaÉ^chi^ijiYZgZX]ZgX]ZejWa^X>cg^VYZej^hjcZk^c\iV^cZVccZh#Zhiedjgfjd^cdjh
kdjadchegdedhZg|igVkZghXZidjkgV\ZjcZkg^iVWaZ^c^i^Vi^dc|D8Vba|aV[d^hVjmYWjiVcihZcegd\gVbbVi^dcZiVjm
egd\gVbbZjgheajhZmeg^bZcihfj^cZXdccV^hhZcieVhXZaVc\V\Z#¿igVkZgheajhYZ&%%eZi^ihegd\gVbbZhZiegh
YZ'%%ZmZgX^XZhVhhdX^h!aZaZXiZjgedjggV\VaZbZciYXdjkg^gaZhXdcXZeih[dcYVbZciVjmYZaVegd\gVbbVi^dcZiYj
aVc\V\ZD8Vba#
¿fj^hÉVYgZhhZXZa^kgZ4
8ZidjkgV\ZedjggVhZgk^gYZbVcjZaYÉ^c^i^Vi^dc|aVegd\gVbbVi^dcD8VbaedjgaZhakZhYZhXaVhhZhegeVgVid^gZhVjm
\gVcYZhXdaZhfj^dciX]d^h^YZhZheX^Va^hZgZc^c[dgbVi^fjZ"kd^ZhBEH>!BEdjBEm"!ZiaZhijY^VcihZc^c[dgbVi^"
fjZ|aÉjc^kZgh^i#:ceajhYZheVhh^dcchYÉVa\dg^i]b^fjZ!XZidjkgV\ZedjggV\VaZbZci^cigZhhZgidjhaZhYkZadeeZjgh
VkVcXhhdj]V^iVcihZidjgcZgkZghjcaVc\V\ZYZegd\gVbbVi^dc[dcXi^dccZaiZaHXVaV!;!HX]ZbZ!A^he!ZiX##
6jhdbbV^gZ
Egd\gVbbVi^dcVkZXDXVba#:ck^gdccZbZcihYZigVkV^a#8dbe^aViZjgZi^ciZgegiZEgZb^Zgegd\gVbbZVkZX
D8Vba:ck^gdccZbZcihYZegd\gVbbVi^dc>chiVaaVi^dcYZW^Wa^di]fjZhD8Vba#9WjiZgVkZXD8VbaZc
egd\gVbbVci#6ccZhW^hhZmi^aZhBi]dYZYZBdciZ"8Vgad9Zhh^cYÉjcZXVgY^dYZ:chZbWaZYZBVcYZa"
Wgdi8g^WaZYÉwgVidhi]cZIgVXYZXdjgWZ8de^ZYÉjcÒX]^ZgGZckZghZgaZha^\cZhYÉjciZmiZ8dckZgh^dc
Zci^ZghZcWVhZfjZaXdcfjZJcXVhhZ"Wg^fjZhhVchWg^fjZhIdgijZAd\d?djZgjcZeVgi^i^dcYZbjh^fjZ
6gWgZhfjViZgcV^gZhGhdjYgZaZegdWabZYZhCgZ^cZh#6eegd[dcY^gaZhXdcXZeihYÉD8Vba#6a\dg^i]bZ
YZineV\ZBdYaZYÉZmXji^dc6cVanhZgaZiZbehYÉZmXji^dcYÉjcegd\gVbbZ#HigjXijgZhYZYdccZh#IV"
WaZVjm#IVWaZVjmgZY^bZch^dccVWaZhIVWaZVjmYZW^ih8dgYZhIVWaZVjmeZgh^hiVcih#:chZbWaZhZiY^Xi^dc"
cV^gZh#6gWgZhW^cV^gZhYZgZX]ZgX]Z6KAIVWaZhYZ]VX]V\Z6gWgZhYZegÒmZh6gWgZhYZEVig^X^V#;^aZh#
;^aZh^begVi^kZh;^aZheZgh^hiVciZh;^aZhYZeg^dg^i^begVi^kZh;^aZhYZeg^dg^ieZgh^hiVciZh#<gVe]Zh#
BVig^XZYÉVY_VXZcXZA^hiZhYÉVY_VXZcXZ9^Xi^dccV^gZYÉVY_VXZcXZ8dbeVgVi^[#8aVhhZhY^h_d^ciZh#Eg^cX^eZ
GVa^hVi^dc#AZo^eeZg#O^eeZgedjgaZha^hiZhO^eeZgedjgaZhVgWgZh8jghZjgh#IZX]c^fjZhVa\dg^i]b^fjZhZi
Veea^XVi^dch#6g^i]bi^fjZ#6a\dg^i]bZYÉ:jXa^YZ:medcZci^Vi^dcgVe^YZ8VaXjabdYjad8VaXjabVig^X^Za#
Egd\gVbbVi^dcYncVb^fjZZibbdhVi^dc#Eg^cX^eZBbdhVi^dchnhibVi^fjZ9^[[gZcXZhZcigZb"
bdhVi^dcZiegd\gVbbVi^dcYncVb^fjZ=Vh]"Xdch^c\#6a\dg^i]bZhYZig^#Ig^eVg^chZgi^dcIg^gVe^YZIg^
[jh^dcIg^eVgiVh8dbeaZm^idei^bVaZwkVajVi^dcZmeg^bZciVaZ#6a\dg^i]bZhhjgaZh\gVe]Zh#EVgXdjgh
ZcaVg\ZjgEVgXdjghZcegd[dcYZjgEajhXdjgiX]Zb^c6gWgZXdjkgVciYZed^Yhb^c^bVa#
IdjhaZhegd\gVbbZhYZXZa^kgZhdciY^hedc^WaZhhjgaZh^iZXdbeV\cdc/
]iie/$$egd\gVbbZg"VkZX"dXVba#ag^#[g$
6eegZcYgZ|egd\gVbbZgVkZXD8Vba
H#8dcX]dc
?#"8#;^aa^}igZ
9 7 8 2 2 1 2 1 3 6 7 8 4
8dYZY^iZjg/<&(+,-
>H7C/.,-"'"'&'"&(+,-")
('!%%%
6eegZcYgZ
|egd\gVbbZg
VkZXD8Vba
6a\dg^i]bZh
ZihigjXijgZhYZYdccZh
HnakV^c8dcX]dcZi?ZVc"8]g^hide]Z;^aa^}igZ
5/1 5
Environnements de travail
6/1 6
Le langage OCaml
http://caml.inria.fr
Ilangage d´
evelopp ´
e`
a l’INRIA (Institut National de Recherche
en Informatique et en Automatique)
Idisponible sur de nombreuses architectures (Linux, Windows,
Mac OS X etc.)
7/1 7
Les outils
Nous allons utiliser les outils suivants en TP :
Iun terminal unix
Iun ´
editeur de texte :emacs
Iun interpr´
eteur de commandes OCaml :ocaml
Iun compilateur pour OCaml : ocamlc
8/1 8
D´
emonstration
Le premier programme :
afficher Hello world! `
a l’´
ecran
9/1 9
L’interpr´
eteur : lancement
Tr`
es pratique pour ´
ecrire de petits programmes ou connaˆ
ıtre la
valeur (ou le type) d’une expression
Pour cela, dans la terminal je tape simplement ocaml
> ocaml
OCaml version 4.01.0
#
Le symbole #est l’invite de commande de l’interpr ´
eteur : il vous
invite `
a´
ecrire une expression OCaml
10/1 10
L’interpr´
eteur : ´
evaluation d’une expression
L´
evaluation d’une expression se fait en trois temps
> ocaml
OCaml version 4.01.0
# 1 + 2 ;;
-:int=3
#
1. Je saisie l’expression et j’indique que j’ai termin ´
e en tapant ;;
2. L’interpr´
eteur ´
evalue mon expression
3. Puis il affiche son type et sa valeur
11/1 11
Le compilateur : ´
edition, compilation, ex´
ecution
L´
ecriture de (gros) programmes n´
ecessite un ´
editeur et un
compilateur
Le cycle d’utilisation du compilateur est ´
egalement en trois temps
1. J’´
ecris mon programme hello.ml `
a l’aide d’emacs
2. Dans le terminal, je compile
> ocamlc -o hello hello.ml
>
3. J’ex´
ecute mon programme
> ./hello
Hello wolrd!
12/1 12
Programme 1 : Ann ´
ees bissextiles
Notions introduites :
Iforme g´
en´
erale d’un programme
Itypes de base (int,bool,string,unit)
Iconstruction let
Iappel de fonction
Ifonction d’affichage Printf.printf
13/1 13
La forme des programmes Ocaml
Un programme OCaml est simplement :
Iune suite de d´
eclarations (let) ou d’expressions `
a´
evaluer
(de haut en bas)
Ila fin d’une d´
eclaration ou d’une expression est sp´
ecifi´
ee par
deux points virgules ;;
Il n’y a donc pas de point d’entr´
ee particulier (fonction
principale par ex.) comme dans d’autres langages.
14/1 14
Types et expressions ´
el´
ementaires
Expressions de type int : les entiers
#4+1-2*2;;
-:int=1
# 5 / 2 ;;
-:int=2
# 1 000 005 mod 2 ;;
-:int=1
# max int + 1 ;;
- : int = -1073741824
Iint repr´
esente les entiers compris entre 230 et 230 1(sur
une machine 32 bits)
Iop´
erations sur ce type : +,-,*,/(division enti`
ere), mod (reste
de la division) etc.
15/1 15
Types et expressions ´
el´
ementaires
Expressions de type bool : les valeurs bool ´
eennes
# false || true ;;
- : bool = true
# 3 <= 1 ;;
- : bool = false
# not (0=2) && 1>=3 ;;
- : bool = false
# if 2<0 then 2.0 else (4.6 *. 1.2) ;;
- : float = 5.52
Iles constantes true (vrai) et false (faux)
Iles op´
erations sur ce type not (non), && (et) et || (ou)
Iles op´
erateurs de comparaison (=,<,>,<=,>=) retournent des
valeurs bool ´
eennes
Idans une conditionnelle de la forme
if exp1then exp2else exp3
l’expression exp1doit ˆ
etre de type bool.
16/1 16
Types et expressions ´
el´
ementaires
Expressions de type char : les caract`
eres
# ’a’ ;;
- : char = ’a’
# int of char ’a’ ;;
- : int = 97
# char of int 100 ;;
- : char = ’d’
Iles caract`
eres sont encadr´
es par deux apostrophes
Ila fonction int of char renvoie le code ASCII d’un caract `
ere
(et inversement pour la fonction char of int).
17/1 17
Types et expressions ´
el´
ementaires
Expressions de type string : les chaˆ
ınes de caract`
eres
# "hello" ;;
- : string = "hello"
# "" ;;
- : string = ""
# "bon" ^ "jour" ;;
- : string = "bonjour"
# "hello".[1] ;;
- : char = ’e’ # string of int 123 ;;
- : string = "123"
Ices valeurs sont encadr ´
ees par deux guillemets "
Il’op´
erateur ^concat`
ene des chaˆ
ınes
Il’op´
eration .[i]acc`
ede au iecaract`
ere d’une chaˆ
ıne (le
premier caract`
ere est `
a l’indice 0)
Ides fonctions de conversions permettent de convertir des
valeurs de types de base en chaˆ
ınes (et inversement)
18/1 18
Le type unit
# () ;;
- : unit = ()
# Print.printf "bonjour\n" ;;
bonjour
- : unit = ()
Iunit repr´
esente les expressions qui font uniquement des
effets de bord
Iune seule valeur a ce type, elle est not´
ee ()
Ic’est l’´
equivalent du type void en C
19/1 19
Les variables globales
# let x = 3 ;;
val x : int = 3
Ile type est inf´
er´
eautomatiquement par le compilateur
Ile contenu d’une variable n’est pas modifiable
Ila port ´
ee est limit´
ee aux d´
eclarations suivantes
#lety=5+x;;
val y : int = 8
# let z = 10 + z ;;
Error: Unbound value z
ILa liaison est statique : la red´
efinition ne change pas la valeur
des expressions pr´
ec´
edentes
# let x = 10 ;;
val x : int = 10
# y ;;
-:int=8
20/1 20
1 / 10 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !