Conf pf15 7
Conf pf15 7
Conf pf15 7
fonctionnelle
Ph. Narbel
Université de Bordeaux, LaBRI
JDev 2015
version 1.2
Situation
I. Comment définir
ce qu’est un langage fonctionnel,
et ce qu’est la programmation fonctionnelle ?
j = 4;
f(i) { g(i) {
return i + 4; j = i + j;
} return j ;
}
f ( 1 ) ; −−> 5 g ( 1 ) ; −−> 5
f ( 1 ) ; −−> 5 g ( 1 ) ; −−> 6
f ( g (3 , h ( ” i c i ” , 9 . 1 ) , l o g (1) , r ( ’ a ’ , ’ c ’ ) ) , 10)
f ( g (3 , h ( ” i c i ” , 9 . 1 ) , 0 , r ( ’ a ’ , ’ c ’ ) ) , 10)
f(x , y , z) {
i f ( x > 0) y e l s e z ;
}
f ( 1 , 1 , exp ( 1 0 0 0 0 0 0 0 0 0 ) ) ;
−−> i f ( 1 > 0 ) 1 e l s e exp ( 1 0 0 0 0 0 0 0 0 0 ) −−> 1 ;
f ( 1 , 1 , 1/0 ) ;
−−> i f ( 1 > 0 ) 1 e l s e 1/0 −−> 1 ;
[ Pure ]
bool F ( i n t i ) {
return ( i + 4) > 0 ;
}
Contract . Requires ( F ( 0 ) ) ;
two_times_exp ( x ) {
r e t u r n exp ( exp ( x ) ) ;
};
↓
two_times_f ( x , f ) {
return f ( f (x ) ) ;
};
f l o a t two_times_exp ( f l o a t x ) {
r e t u r n exp ( exp ( x ) ) ;
}
↓
f l o a t two_times_f ( f l o a t x , f u n t f l o a t f l o a t f ) {
return f(f(x ) ) ;
}
f l o a t two_times_f ( f l o a t x , f u n t f l o a t f l o a t f ) {
return f(f(x ) ) ;
}
↓
T1 two_times_f ( T1 x , f u n t ( T1 , T1 ) f ) {
return f(f(x ) ) ;
}
L’exemple précédent en C# :
T1 TwoTimesFun<T1>( T1 x , Func<T1 , T1> f ) {
return f(f(x ) ) ;
}
list_map ( list , f ) {
i f ( isEmpty list )
r e t u r n emptyList ;
else
r e t u r n addFirst ( f ( getFirst ( list ) ) ,
list_map ( getTail ( list ) , f ) ) ;
}
list_filter ( list , p r e d ) { . . . }
En Java 8 (java.util.stream.ReferencePipeline) :
Stream<Integer> q = giraffes . stream ( )
. map ( g −> g . age ∗ 3 ) ;
. filter ( g −> g . age > 2 )
. sorted ( ( g1 , g2 ) −> Integer . compare ( g1 . age , g2 . age ) )
v a r add5 = curried_add ( 5 ) ;
add5 ( 3 ) −−> 8
Ph. Narbel Usages et perspectives de la programmation fonctionnelle 35
Conséquences de la première classe
Pouvoir être stocké dans une structure de données permet :
Gestion d’ensembles de fonctions, structurés en listes, tables, arbres,
graphes, etc. (cf. “modularité dynamique”).
graphic_actions := [
( ’ f1 ’ , ( x , y) −> action1 ( x , y ) ) ,
( ’ f2 ’ , ( x , y) −> action2 ( x , y ) ) ,
( ’ f3 ’ , ( x , y) −> action3 ( x , y ) ) ,
...
];
Par exemple :
benchMarkAndTest ( f u n c t i o n ( ) { exp ( 1 0 0 0 0 0 0 0 0 0 ) ; } )
(issu du GoF)
Ph. Narbel Usages et perspectives de la programmation fonctionnelle 40
Un design pattern classique : la Stratégie
Tactique fonctionnelle d’implémentation : passage de
fonctions en paramètre (cf. première classe) (en Java 8) :
c l a s s Context {
Function<Float , Float> a l g o r i t h m ;
// p r e d e f i n e d f u n c t i o n a l i n t e r f a c e
Context ( Function<Float , Float> a ) { a l g o r i t h m = a ; }
f l o a t context ( f l o a t x ) {
return algorithm . apply (x ) ;
}
}