On utilise une fonction auxilliaire dédouble qui prend en argument supplémentaire le morceau de (vraie) liste déjà construite.
let rec dédouble déjà_construite à_dédoubler = match à_dédoubler with | Vide -> déjà_construite | Gauche (h,t) -> h :: (dédouble déjà_construite t) | Droite (t, h) -> dédouble (h :: déjà_construite) t;; let list_of_double l = dédouble [] l;; let l = list_of_double d;;