Programmation Fonctionnelle Cours 5 Fonctions d`ordre supérieure

publicité
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Table de matières
Programmation Fonctionnelle
Cours 5
Fonctions d'ordre supérieure
Les fonctions sont des valeurs de première classe
Application partielle
Fonctions polymorphes
October 18, 2012
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Les fonctions sont des valeurs de première classe
Valeurs de première classe
I
Valeurs qui peuvent être utilisées dans un langage de
programmation sans restriction, par exemple :
I
I
I
I
I
I
lier à un identicateur (ou variable)
passer en argument à une fonction (ou procédure)
retourner comme résultat d'une fonction
faire partie des structures de données (par exemple, une liste
de telles valeurs)
avoir une notion d'identité (test d'égalité)
À l'origine appelé rst-class objects (Christopher Strachey),
mais pas à confondre avec les objets dans le sens propre.
Le module List de la bibliothèque standard
Le manuel OCaml
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Les fonctions sont des valeurs de première classe
Valeurs fonctionnelles en OCaml
I
I
I
I
I
function id → exp
C'est une fonction qui prend un argument, dénoté par
l'identicateur id, et qui envoie comme résultat la valeur de
l'expression exp.
La portée de id est exp
Le type de cette valeur est t1 → t2 , où t1 est le type de
l'argument, et t2 est le type du résultat de la fonction.
Le type est déterminé utilisant des informations dans
l'expression exp, et peut être polymorphe (voir un peu plus
tard).
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Les fonctions sont des valeurs de première classe
Les fonctions sont des valeurs de première classe
Exemples (function1.ml)
f u n c t i o n x −> x +1;;
f u n c t i o n y −> [ [ y+2; y +3]; [ y ;
l e t i n c = f u n c t i o n x −> x +1;;
Fonctions à un argument
y∗y ] ] ; ;
inc 5;;
l e t i n c x = x +1;; ( ∗ e q u i v a l e n t au p r e c e d e n t
( f u n c t i o n x −> x+3) 5 ; ;
let f x = e
∗)
est une abréviation pour
let f = function x -> e
( f u n c t i o n x −> x ∗ x ) ( f u n c t i o n x −> x+1) 3 ; ; ( ∗ e r r e u r ∗ )
( f u n c t i o n x −> x ∗ x ) ( ( f u n c t i o n x −> x+1) 3 ) ; ; ( ∗ OK ∗ )
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Les fonctions sont des valeurs de première classe
La forme générale de function
I
I
Plus généralement, on peut avoir après function un ltrage
par motif.
let f = function
| motif_1 -> expression_1
....
| motif_n -> expression_n
La forme function x → exp en
est un cas particulier : un
seul motif, qui est un seul identicateur.
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Les fonctions sont des valeurs de première classe
Exemples (function2.ml)
l e t re c l e n g t h = f u n c t i o n
| [ ] −> 0
| _: : r −> 1+ l e n g t h r
;;
expr =
| I n t of i n t
| Add of expr ∗ expr
| Mult of expr ∗ expr ; ;
type
e v a l = function
| I n t n −> n
| Add( e1 , e2 ) −> ( e v a l e1 ) + ( e v a l e2 )
| Mult ( e1 , e2 ) −> ( e v a l e1 ) ∗ ( e v a l e2 ) ; ;
l e t re c
e v a l (Add ( Mult ( I n t 2 , I n t 5) , Mult ( I n t 3 , I n t 3 )
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Application partielle
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Application partielle
Fonctions à plusieurs arguments
Exemples (function3.ml)
expr =
| Var of s t r i n g
| Add of expr ∗ expr
| Mult of expr ∗ expr ; ;
type
I
I
I
fun x1
. . . xn → t
Utiliser match . . . with pour des distinctions de cas (pas de
ltrage par motif intégré, comme dans le cas de function)
Peut aussi être utilisé pour un seul argument.
e v a l = fun environment expr −> match expr w
| Var x −> L i s t . a s s o c x environment
| Add( e1 , e2 ) −> ( e v a l environment e1 ) + ( e v a l envi
| Mult ( e1 , e2 ) −> ( e v a l environment e1 ) ∗ ( e v a l env
l e t re c
e v a l [ ( "x" , 2 ) ; ( "y" , 5 ) ] (Add( Var "x" , Mult ( Var "x" ,
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Application partielle
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Application partielle
fun et function
Exemples (function4.ml)
expr =
| Var of s t r i n g
| Add of expr ∗ expr
| Mult of expr ∗ expr ; ;
type
fun x1 x2 .. xn -> e
est une abréviation pour
function x1 -> function x2 -> ... function xn -> e
l e t re c e v a l =
f u n c t i o n environment −>
f u n c t i o n expr −> match
expr with
| Var x −> L i s t . a s s o c x environment
| Add( e1 , e2 ) −> ( e v a l environment e1 ) + ( e v a l
| Mult ( e1 , e2 ) −> ( e v a l environment e1 ) ∗ ( e v a l
e v a l [ ( "x" , 2 ) ; ( "y" , 5 ) ] (Add( Var "x" , Mult ( Var "x" ,
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Application partielle
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Application partielle
Exemples (function5.ml)
Application partielle
expr =
| Var of s t r i n g
| Add of expr ∗ expr
| Mult of expr ∗ expr ; ;
type
Une fonction à n ≥ 2 arguments x1 , . . . , xn est en vérité une
fonction qui prend x1 en argument, et qui envoie une fonction
qui prend x2 , . . . , xn en argument.
I L'application f e1 e2 . . . en est en vérité une chaîne
l e t re c e v a l = f u n c t i o n environment −> f u n c t i o n
d'applications (. . . ((f e1 ) e2 ) . . . en )
| Var x −> L i s t . a s s o c x environment
I Application partielle : appliquer une fonction, dénie avec
| Add( e1 , e2 ) −> ( e v a l environment e1 ) + ( e v a l environment e2 )
| Mult ( e1 , e2 ) −> ( e v a l environment e1 ) ∗ ( e v a l environmentn arguments,
e2 ) ; ; à moins que n arguments. Le résultat est encore
une fonction.
e v a l [ ( "x" , 2 ) ; ( "y" , 5 ) ] (Add( Var "x" , Mult ( Var "x" , Var "y" ) ) ) ; ;
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Application partielle
I
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Application partielle
Qu'est-ce qu'il se passe lors d'une application ?
Une application :
Qu'est-ce qu'il se passe lors d'une application ?
On a maintenenant :
ef ea
Le typage nous guarantie :
I ef est d'un type fonctionnel ta → tr
I ea est du type ta
(si on ignore la polymorphie)
Évaluer les deux expressions
I
I
Évaluation de ef donne une valeur fonctionnelle
function x → ec
Évaluation de ea donne
une valeur va
(function
x → ec ) va
Substituer dans le corps de la fonction:
ec [x /va ]
Dans le corps ec on remplace toute occurrence de x par va
Évaluer l'expression obtenue tant que possible
I
On n'évalue pas au dessous de function
x →
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Application partielle
Application partielle
Exemple
Exemple (continu)
let f = function x -> function y -> x+y
I
f
est lié à function
x -> function y -> x+y
g (3+4)
let g = f 1
I
I
I
I
Évaluation de f : function x
1 est déjà évaluée
Substitution : function y ->
I
I
-> function y -> x+y
function y -> 1+y
g est lié à function y -> 1+y
x+y[x/1]
I
I
donne
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Application partielle
Exemples (function6.ml)
Évaluation de g donne function y ->
Évaluation de 3 + 4 donne 7
Substitution : 1+y[y/7] donne 1 + 7
Évaluation donne 8
Application partielle
Exemples (function7.ml)
expr =
| Var of s t r i n g
| Add of expr ∗ expr
| Mult of expr ∗ expr ; ;
type
f x y z = x+2∗ y+3∗ z ; ;
g = f 2;;
h = g 3;;
l e t re c e v a l = f u n c t i o n environment −> f u n c t i o n
h 4;;
| Var x −> L i s t . a s s o c x environment
l e t fe2x) y = x ∗ y ; ;
| Add( e1 , e2 ) −> ( e v a l environment e1 ) + ( e v a l environment
( f 2) e2( ()f; ; 3) 4 ) ; ;
| Mult ( e1 , e2 ) −> ( e v a l environment e1 ) ∗ ( e v a l environment
let
eval_in_myenv = e v a l [ ( "x" , 2 ) ; ( "y" , 5 ) ] ; ;
eval_in_myenv (Add( Var "x" , Mult ( Var "x" , Var "y" ) ) ) ; ;
let
let
let
1+y
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Application partielle
Fonctions polymorphes
Exemples (lambda.ml)
Exemples (function8.ml)
( ∗ pas d ' e v a l u a t i o n au d e s s o u s de f u n c t i o n y −> . . . ∗ )
let
f =
function
x −>
function
y −> (1 / x ) + y ; ;
let
g = f 0 ; ; ( ∗ pas d ' e r r e u r
let
z = g 5 ; ; (∗ E r r e u r : d i v i s i o n par z e r o
h 4;;
∗)
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Fonctions polymorphes
Exemples (lists1.ml)
( ∗ d e f i n e d i n l i b r a r y a s L i s t . map ∗ )
l e t re c map f = f u n c t i o n
| [ ] −> [ ]
| h : : r −> ( f h ) : : ( map f r ) ; ;
map ( f u n c t i o n x −> x ∗ x ) [ 1 ; 2 ; 3 ; 4 ; 5 ] ; ;
f u n c t i o n x −> x ; ;
l e t compose f g = f u n c t i o n x −> f ( g x ) ; ;
l e t h = compose ( f u n c t i o n x −> x ∗ x ) ( f u n c t i o n
i t e r n f x = i f n=0 then x
i t e r 3 ( f u n c t i o n x −> x ∗ x ) 2 ; ;
l e t re c
∗)
else
x −> x
i t e r ( n −1) f
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Fonctions polymorphes
Des valeurs fonctionnelles en OCaml
I
I
Pour tout opérateur inx (opérateur binaire qui est écrit entre
ses deux arguments), la fonction correspondante dénotée par
l'opérateur entre paranthèses. Exemple : (+).
Les constructeurs des types sommes ne sont pas de valeurs
fonctionnelles (comme par exemple ::).
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Fonctions polymorphes
Le module
Exemples (fonctionnelle.ml)
map : ('a -> 'b) -> 'a list -> 'b list
List.map f [a1; ...; an] donne [f a1; ...; f an]
l e t re c expo n f = f u n c t i o n x −>
i f n=1 then x e l s e f ( expo ( n − 1)
expo 5 (+) 1 ; ;
mytype = A | B
of
f x ) ( expo ( n −1) f
fold_right : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b
List.fold_right f [a1; ...; an] b donne
f a1 (f a2 (... (f an b) ...))
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
List
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
de la bibliothèque standard
Le module
Exemples (lists3.ml)
end ; ;
pr x = p r i n t _ i n t x ; p r i n t _ n e w l i n e ( ) ; ;
i t e r pr [ 1 0 ; 1 1 ; 1 2 ; 1 3 ] ; ;
let
List
de la bibliothèque standard
Exemples (lists2.ml)
(∗ d e f i n e d i n l i b r a r y as L i s t . i t e r ∗)
l e t re c i t e r f = f u n c t i o n
| [ ] −> ( )
| h : : r −> begin f h ; i t e r f r
iter : ('a -> unit) -> 'a list -> unit
f [a1; ...; an] donne
x )List.iter
;;
begin f a1; f a2; ...; f an; () end
fold_left : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a
List.fold_left f a [b1; ...; bn] donne
f (... (f (f a b1) b2) ...) bn
int ;;
A ; ; ( ∗ OK ∗ )
B ; ; (∗ e r r e u r ∗)
f u n c t i o n x −> B x ; ; ( ∗ OK ∗ )
Le module
de la bibliothèque standard
Quelques fonctions prédénies sur les listes
(+);;
( ∗ );;
type
List
(∗ d e f i n e d i n l i b r a r y as L i s t . f o l d _ r i g h t ∗)
( ∗ L i s t . f o l d _ r i g h t f [ a1 ; . . . ; an ] b i s ∗ )
( ∗ f a1 ( f a2 ( . . . ( f an b ) . . . ) )
∗)
l e t re c f o l d _ r i g h t f l b = match l with
| [ ] −> b
| h : : r −> f h ( f o l d _ r i g h t f r b ) ; ;
f o l d _ r i g h t ( fun x y −> x : : y ) [ 1 ; 2 ; 3 ; 4 ] [ ] ; ;
f o l d _ r i g h t (+) [ 1 ; 2 ; 3 ; 4 ] 0 ; ;
fold_right ( ∗ ) [1;2;3;4] 1;;
l e t c l 1 l 2 = f o l d _ r i g h t ( fun x y −> x : : y ) l 1 l 2 ; ;
c [1;2;3;4] [5;6;7;8];;
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Le module
List
de la bibliothèque standard
Le module
La fonction fold.right
f [a1; a2; ...
an] b
a1
| [ ] −> b
| h : : r −> f o l d _ l e f t f ( f b h ) r ; ;
f o l d _ l e f t (+) 0 [ 1 ; 2 ; 3 ; 4 ] ; ;
f o l d _ l e f t ( fun x y −> y : : x ) [ ] [ 1 ; 2 ; 3 ; 4 ] ; ;
f
a2
f
an
b
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
de la bibliothèque standard
Le module
La fonction fold.left
List
de la bibliothèque standard
Exemples (lists5.ml)
Évaluation de List.fold_left
f a [b1; b2; ... bn]
f
f
bn
b2
b1
:
( ∗ c a l c u l e r l a l i s t e de t o u t e s l e s sous − l i s t e s ∗ )
powers = f u n c t i o n
| [ ] −> [ [ ] ]
| h : : r −>
l e t rp = powers r i n
rp@ ( L i s t . map ( f u n c t i o n l −> h : : l ) rp ) ; ;
l e t re c
f
a
:
(∗ d e f i n e d i n l i b r a r y as L i s t . f o l d _ l e f t ∗)
l e t re c f o l d _ l e f t f b = f u n c t i o n
f
List
de la bibliothèque standard
Exemples (lists4.ml)
Évaluation de List.fold_right
Le module
List
powers [ 1 ; 2 ; 3 ] ; ;
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Le module
List
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
de la bibliothèque standard
Le module
Itérateurs sur 2 listes
I
Lève l'exception invalid_argument quand les deux listes ont
des longueurs diérentes
Voir le manuel pour plus de fonctions
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Le module
List
l e t vsum v1 v2 = L i s t . map2 (+) v1 v2 ; ;
vsum [ 1 ; 2 ; 3 ] [ 1 0 ; 2 0 ; 3 0 ]
( ∗ d e f i n i t i o n p l u s s i m p l e de vsum ? ∗ )
Le module
Exemples (lists7.ml)
List
de la bibliothèque standard
Exemples (lists8.ml)
(∗ p r o d u i t s c a l a i r e ∗)
( ∗ somme de deux m a t r i c e s ∗ )
let
scp [ 2 ; 4 ; 6 ] [ 1 ; 3 ; 5 ] ; ;
( ∗ somme de deux v e c t e u r s ∗ )
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
de la bibliothèque standard
scp v1 v2 =
L i s t . f o l d _ l e f t (+) 0 ( L i s t . map2 (
de la bibliothèque standard
Exemples (lists6.ml)
val map2 : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list
List.map2 f [a1; ...; an] [b1; ...; bn] donne
[f a1 b1; ...; f an bn]
I
List
∗
) v1 v2 ) ; ;
msum m1 m2 = L i s t . map2 ( L i s t . map2 (+)) m1 m2 ; ;
msum = L i s t . map2 ( L i s t . map2 ( + ) ) ; ;
msum [ [ 1 ; 2 ] ; [ 3 ; 4 ] ] [ [ 1 0 ; 2 0 ] ; [ 3 0 ; 4 0 ] ] ; ;
let
let
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Le manuel OCaml
Les quatre parties du manuel
1. Introduction au langage (assez concis)
2. Manuel de référence
3. Les outils : interpréteur, compilateurs, . . .. Aussi informations
sur l'interfacage avec le langage C.
4. Les librairies
Programmation Fonctionnelle Cours 5 Fonctions d'ordre supérieure
Le manuel OCaml
Les librairies dans le manuel
1. The core library : types, valeurs (incl. fonctions !), et
exceptions disponibles par défaut. Suivre le lien Module:
Pervasives
2. The standard library : Modules pour lesquels il faut utiliser la
notion pointée (List.map). Ces fonctions sont écrites
eux-mêmes en OCaml.
3. Plusieurs autres bibliothèques qui sont écrites en C, et pour
lesquels il y a des instructions particulières à suivre pour les
utiliser dans un interpréteur, ou lors de la compilation.
Téléchargement