Monades
Si
le simple fait d'afficher des données à l'écran
ou encore de les écrire dans un fichier est considéré
comme effet de bord, comment s'acquitter de ce type de taches avec
un langage fonctionnel ? C'est là qu'interviennent les monades,
un concept abstrait qui exprime la composition séquentielle,
c'est à dire la capacité à ordonner les fonctions
en séquences. Il existe ainsi des monades d'entrée/sorties,
de gestion d'exceptions... Ces monades permettent de transmettre
l'état de l'environnement d'une fonction à l'autre
de la séquence.
D'un point de vue "déclaratif", l'interdiction
des effets de bord combinée à la présence de
monades (qui sont plus ou moins des fonctions "impératives")
permet la séparation franche et nette entre les fonctions
"pures", sans effet de bord, et les fonctions "impures",
qui font appel aux effets de bord pour une action très spécifique.
En quelque sorte, les monades masquent les effets de bord et permettent
de séparer le monde des valeurs (qui n'ont pas d'effet
de bord) de celui des calculs (qui peuvent en avoir) : ce
système est donc une manière beaucoup plus propre
de faire ce que fait la programmation impérative.
Paresse
L'évaluation non-stricte d'une expression (lazy
evaluation) - celle-ci n'est pas évaluée dès
qu'une variable lui est envoyée, mais uniquement lorsque
le résultat de l'évaluation est nécessaire
au bon déroulement du programme, auquel cas le résultat
est stocké au cas où il serait utile pour une autre
fonction - permet en outre, en programmation fonctionnelle, de se
dispenser des calculs inutiles... "L'évaluation paresseuse"
n'est évidemment pas compatible avec les effets de bord :
si une fonction n'est pas évaluée, son effet de bord,
nécessaire à une autre fonction, ne se produirait
pas.
Quelques
exemples
Comme nous l'avons vu, il existe des langages fonctionnels purs
et des langages fonctionnels impurs, la différence étant
qu'un langage impur autorise certains aspects de la programmation
impérative (effets de bord...) et donc que le concept de
"programme paresseux" n'est pas vraiment applicable...
Langages
purs :
Miranda
: le premier langage fonctionnel conçu dans le but de développer
des applications commerciales plutôt dans un but de recherche.
Haskell
: l'un des derniers-nés de la famille, et probablement le
mieux vu par la communauté.
Erlang
: Open Source après avoir été créé
par Ericsson, il a la spécificité d'être utilisé
dans de gros projets industriels.
Langages impurs :
Lisp : l'ancêtre, apparu dans les années
50. Son nom vient du fait qu'il était spécialisé
dans le traitement de listes (LISt Processor), à une
époque où l'on se préoccupait surtout du calcul numérique.
Il est depuis devenu un incontournable de la Recherche, notamment
en intelligence artificielle.
Scheme
: une évolution de Lisp prônant la simplicité
et "l'élégance conceptuelle". C'est le langage
de script de GIMP.
ML : (Meta-Langage) décrit une famille de langages
fonctionnels, dont Standard
ML, Lazy ML, CAML,
OCaml
et autres...
Pour
qui ?
La plupart des développeurs n'auront jamais à se soucier
de langages autres qu'impératifs au cours de leur carrière,
aussi l'intérêt d'étudier les autres types de
langages peut leur sembler extrêmement limité. Pourtant,
plus qu'une simple entrée supplémentaire sur un CV,
la connaissance de la programmation fonctionnelle ouvre à
d'autres manières, peut-être plus efficaces ou plus
appropriées dans le cadre d'un projet donné, de résoudre
un problème posé, introduit des concepts et des solutions
vraiment indépendantes du langage, facilite la compréhension
de la relation entre algorithme et programme, et surout augmente
la palette des choix d'outils à disposition...
Pour les habitués de "l'impératif", l'apprentissage
d'un langage fonctionnel peut être tendu et long, mais quand
le déclic se fera entendre, cette formation, de notre point
de vue, vaudra la chandelle.
Page 1
| 2
|