Une composition à la compilation peut se faire à coup de préprocesseur, là le but c’est de le faire à l’éxécution: par exemple itérer n fois une application en un temps en ln(n):
[code]let compose f g = function x-> (f (g x));;
let rec puissance f = function
| 0 -> (function x->x)
| 1 -> f
| n -> let g = (puissance f (n/2)) in
let h = (compose g g) in
if (n mod 2) = 1 then (compose f h)
else h;;
let add1 x = x+1;;
(puissance add1 14) 0;;[/code]
Il n’y a eu que 5 appels à la fonction compose et non 14…