Le fichier pgcd.ml donne une solution, dont est extraite la fonction pgcd suivante :
let rec pgcd u v =
  if v = 0 then
    u
  else
    pgcd v (u mod v)
;;

(On a un peu altéré l'algorithme de l'énoncé, en remplaçant la condition « v divise u » par un test v=0 à l'appel récursif suivant.)
Du point de vue du langage, on remarque que les fonctions ne sont pas récursives par défaut : il faut introduire une fonction récursive par let rec.

On remarque aussi que Caml favorise l'écriture à l'aide de fonctions récursives (ici terminales, le résultat est donné par un appel récursif) par rapport aux boucles. Comparons avec un codage plus traditionnel à l'aide d'une boucle while.
let pgcd u v =
  let ur = ref u and vr = ref v in
  while
 !vr <> 0 do
    let
 x = !vr in
    vr := !ur mod !vr ;
    ur := x
  done ;
  !ur
;;
C'est moche, pour le meilleur comme pour le pire, Caml n'est pas fait pour écrire des boucles. Qu'on se le dise !