Cours num´
ero 2: environnements – fonctions –
fonctions r´
ecursives
LI213 – Types et Structures de donn ´
ees
Christophe Gonzales – Pierre-Henri Wuillemin
Licence d’Informatique – Universit´
e Paris 6
Les fonctions en OCAML
Qu’est-ce qu’une fonction en OCAML ?
C’est une valeur comme une autre (au mˆ
eme titre qu’un int, un
float ou un char).
Cons´
equences :
une fonction a un type
on peut cr´
eer des liaisons dont la valeur est une fonction
(affecter une fonction `
a un identifiant)
on peut cr´
eer des fonctions visibles uniquement dans un
environnement local
etc
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
Types des fonctions
Notations des types des fonctions
Vus dans le manuel de r´
ef´
erence (core library, module
Pervasives) :
int of float : float -> int
int of float prend en argument un float et renvoie un
int
mod float : float -> float -> float
mod float prend deux arguments (des float) et renvoie
le float ´
egal au reste de la division du premier argument
par le deuxi`
eme.
R`
egle : le type d’une fonction est obtenu en ´
ecrivant le type de
ses arguments suivi du type de retour de la fonction, le tout
s´
epar´
e par des ->
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
Application de fonction
Comment appliquer une fonction ?
´
Ecrire le nom de la fonction suivi de son (ou ses) argument(s),
le tout s´
epar´
e par des espaces (comme en Scheme)
Exemple :
mod float de type : float -> float -> float
#mod float 3.4 2.;;
- : float = 1.4
ne pas mettre les arguments entre parenth`
eses s´
epar´
es
par des «,»(voir le cours sur les n-uplets)
#mod float (3.4,2.);;
This expression has type float *float
but is here used with type float
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
D´
eclaration d’une fonction (1/3)
Comment cr´
eer une fonction
Trois mani`
eres diff´
erentes :
1letfx=x+1;;(m´
ethode pr´
ef´
er´
ee)
noms des param`
etres : plac´
es entre le nom de la fonction
et le signe =
2let f = function x -> x + 1 ;;
chaque param`
etre est plac´
e entre un mot-cl´
efunction et
une -> (moins, sup´
erieur)
3let f = fun x -> x + 1 ;;
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
D´
eclaration d’une fonction (2/3)
letfx=x+1;;
Type de la fonction
f : int -> int
le type du premier argument, suivi d’une fl`
eche suivie du type
du deuxi`
eme argument, suivi d’une fl`
eche, ..., suivi d’une fl`
eche
suivie du type de valeur retourn´
ee par la fonction
=impossible de d´
eclarer :
#let f x = if x < 4 then 3.5 else 6;;
car la valeur retourn´
ee n’aurait pas un type bien d´
efini (float si
x<4ou int si x4)
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
D´
eclaration d’une fonction (3/3)
Soit l’environnement E
letfxy=x+y+1;;
Valeur de la fonction
La valeur d’une fonction est sa fermeture not ´
ee :
x y x+y+1,E
Elle est caract´
eris ´
ee par :
les noms des param`
etres formels (x,y)
le corps de la fonction (x+y+1)
l’environnement Edans lequel la fonction a ´
et´
e d´
efinie
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
Exemple d’application de fonction
Soit l’environnement E = b(x,7.6), (y,-7.8), ...c
#let x au plus pres = int of float (x +. 0.5)
and y au plus pres = int of float (y -. 0.5);;
val x au plus pres : int = 8
val y au plus pres : int = -8
´
Evaluation : x +. 0.5 est ´
evalu´
e dans l’environnement E =8.1
puis int of float est appliqu ´
e`
a 8.1 =l’entier 8
Pourquoi faut-il des parenth`
eses ?
Sinon OCAML parenth `
ese de la mani`
ere suivante :
let x au plus pres = (int of float x) +. 0.5
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
´
Evaluation d’une application de fonction (1/4)
M´
ecanisme d’´
evaluation de f x
Soit E = b(x,3),...,(f,y y+1, Env f)CEnv fc
l’environnement dans lequel on applique f x ;;
1x est ´
evalu´
e dans l’environnement courant E =3
2f est ´
evalu´
ee dans E =fermeture :
y y+1, Env f
3on cr´
ee un env local E loc = b(y,3) CEnv fc:
on rajoute donc `
a Env f une liaison entre y, le param`
etre
formel de f, et sa valeur (3)
4On ´
evalue le corps de f (ici y+1) dans E loc =4
5On retourne la valeur 4 et on d´
etruit E loc
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
´
Evaluation d’une application de fonction (2/4)
#let y = 3 ;;
letfx=ify=2thenxelsex-2;;
let y = 2 ;;
f 3;;
Que vaut f 3 ? 3 ou 1 ?
Indice : constituer l’environnement :
Au d´
epart, environnement E0
puis E1=b(y,3) CE0c
puis E2=b(f,x ..., E1),(y,3) CE0c
puis E3=b(y,2),(f,x ..., E1),(y,3) CE0c
f 3 est ´
evalu´
ee dans E3
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
´
Evaluation d’une application de fonction (3/4)
#let y = 3 ;;
letfx=ify=2thenxelsex-2;;
let y = 2 ;;
f 3;;
E1=b(y,3) CE0c
E3=b(y,2),(f,x ..., E1),(y,3) CE0c
13 est ´
evalu´
e dans E3=3
2f est ´
evalu´
e dans E3=fermeture :
x ify=2thenxelsex-2,E1
3on cr´
ee un environnement local E loc = b(x,3) CE1c
4on ´
evalue ify=2thenxelsex-2dans E loc 1
5on retourne 1 et on d´
etruit E loc
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
´
Evaluation d’une application de fonction (4/4)
R`
egle : Les valeurs des «identifiants»utilis´
ees dans le corps
d’une fonction (except´
es celles des param`
etres formels) sont
celles que ces identifiants avaient lors de la d ´
eclaration de la
fonction
=vous pouvez d´
efinir de nouvelles liaisons avec des
identifiants utilis´
es dans une fonction, cela n’a aucun impact sur
la fonction.
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
Les fonctions `
a plusieurs param`
etres
#letfxy=x+y
and g = function x -> function y -> x + y
and h = function x -> (function y -> x + y);;
val f : int -> int -> int = <fun>
val g : int -> int -> int = <fun>
val h : int -> int -> int = <fun>
Fonctions `
a plusieurs param`
etres
function x -> function y -> x + y
function x -> (function y -> x + y)
=une fonction `
anparam`
etres est une fonction `
a un seul pa-
ram`
etre renvoyant une fonction `
an1 param`
etres
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
Application partielle (1/2)
Application partielle : appliquer une fonction en lui passant ses
premiers mais pas l’ensemble de ses arguments
#letfxy=x+y;;
let g = f 3 ;;
g 2;;
val f : int -> int -> int = <fun>
val g : int -> int = <fun>
-:int=5
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
Application partielle (2/2)
#letfxy=x+y;;
let g = f 3 ;;
g 2;;
E1=b(f,x y x+y, E0),...c
1on ´
evalue 3 dans E1=3
2on ´
evalue f dans E1=⇒ x y x+y,E0
3on cr´
ee E2=b(x,3) CE0c
4on ´
evalue le corps de la fonction dans E2=fonction
y x+y dans l’environnement E2=y x+y,E2
5on modifie l’env : E3=b(g,y x+y, E2)CE1c
6on r´
ecup`
ere valeur de 2 et la fermeture de g dans E3
7on cr´
ee E4=b(y,2) CE2c
8on ´
evalue x + y dans E4=5
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
Les fonctions r ´
ecursives
#let fact x =
if x = 0 then 1
else x *(fact (x-1));;
Unbound value fact
probl`
eme : si on veut ´
evaluer f 3, on fait appel `
af 2.
Or f n’appartient pas `
a l’environnement de la fermeture de f !
R`
egle : pour d´
eclarer une fonction r´
ecursive, utiliser let rec
=rajoute une liaison entre f et sa fermeture dans
l’environnement de la fermeture de f
#let rec fx=
if x = 0 then 1
else x *(f(x-1));;
val f : int -> int = <fun>
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
Les fonctions r ´
ecursives imbriqu ´
ees
on veut d´
eclarer deux fonctions f et g telles que f appelle g et g
appelle f =f doit appartenir `
a la fermeture de g et g doit
appartenir `
a la fermeture de f
R`
egle : pour d´
eclarer des fonctions r´
ecursives imbriqu ´
ees,
utiliser let rec ... and ...
#let rec pair x =
if x = 0 then true else impair (x-1)
and impair x =
if x = 0 then false else pair (x-1) ;;
pair 3;;
val pair : int -> bool = <fun>
val impair : int -> bool = <fun>
- : bool = false
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
La pile d’ex ´
ecution (1/2)
Ex´
ecution d’une fonction :
let y = f 3 in
let f x = x + 1;;
y + 2;;
let f x = x + 1;;
#
2 probl`
emes :
1comment retourner la valeur de f 3 `
ay?
2comment savoir quelle est la prochaine instruction `
a
ex´
ecuter apr`
es la fin de la fonction ?
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
La pile d’ex ´
ecution (2/2)
let f x = x + 1;;
let y = f 3 in
let f x = x + 1;;
y + 2;;
Pile d’exécution
let f x = x + 1;;let f x = x + 1;;
3
#
1copier sur la pile d’ex´
ecution les param`
etres, l’adresse de
la prochaine instruction `
a ex´
ecuter apr`
es f 3, etc
2futilise la pile pour la valeur des param`
etres
3fstocke la valeur `
a retourner dans la pile
4la pile indique quelle liaison effectuer pour yet quelle est
la prochaine instruction `
a ex´
ecuter
5on d´
epile l’appel `
a la fonction f
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
Limite de la pile d’ex ´
ecution
Probl`
eme : la pile d’ex´
ecution n’a pas une taille infinie
=nombre limit ´
e d’appels de fonctions
Exemple
#letrecfx=x+fx;;
val f : int -> int = <fun>
#f 3;;
Stack overflow during evaluation
(looping recursion ?).
Est-ce une fatalit´
e ?
Pas en OCAML ! !
Christophe Gonzales – Pierre-Henri Wuillemin Cours num´
ero 2: environnements – fonctions – fonctions r´
ecursives
1 / 7 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 !