Précédent

  Composition

 

 
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:
 
;;; o: (a®b)×(b®g)®(a®g) 
;;; (o f g) calcule la fonction correspondant à "f rond g". 
(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:
 

;;; composition:  
(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 ?



 

Précédent