Composer des fonctions s'écrit simplement en Scheme, composer les
fonctions unaires
f et
g appliquées à un terme
x s'écrit
directement en
g(
f(
x)). Ce qui est plus rare parmi les langages de
programmation et qui est possible en Scheme est que l'on peut composer
des fonctions sans même les appliquer.
Composer des fonctions en mathématiques s'écrit
f° g (prononcé f
rond g). Cette composition revient à appliquer
g au résultat de
f. Ainsi (
f° g)(
x) =
g(
f(
x)). Il suffit de transcrire cette
définition en Scheme et définir la fonction
o qui prend deux
fonctions unaires et les compose:
;;;
;;;
(define (o f g)
(define (composee x)
(g (f x)) )
composee )
Ainsi, en appliquant les règles classiques de substitution, on peut
montre que la composée de car et cdr est bien
équivalente à cadr:
((o cdr car) '(a b c)) º
(composee '(a b c)) avec
(define (composee x)
(cdr (car x)) )
(cdr (car '(a b c))) ® b
On peut également étendre l'opérateur de composition pour prendre une
liste de fonctions et les composer toutes:
;;;
(define (composition lfns)
(define (identite x) x)
(reduce o identite lfns) )
((composition (list cdr cdr car)) (list 1 2 3 4)) ® 3
(dans l'argument de composition, noter que la fonction
list n'est pas une fonction composée: c'est le constructeur de
listes qui permet de créer la liste (cdr cdr car); noter aussi
que nous ne pouvons pas utiliser la citation puisque nous voulons une
liste de fonctions et non de symboles)
Les fonctions existent en mathématiques; les fonctions existent de la
même manière en Scheme. Aviez-vous déjà songé que l'opération
mathématique ° était en fait une fonction ?