(* Parcourir toutes les paires d'éléments adjacents d'une liste,
   la liste étant considérée comme circulaire, i.e.,

     fold_pairs f v [x1;x2;...;xn]

   calcule

     f(f(...f(f(v,x1,x2),x2,x3)...,xn-1,xn),xn,x1)
*)

let fold_pairs f v = function
  | [] | [_] -> v
  | x1 :: l ->
    let acc, xn =
      List.fold_left (fun (acc, prev) x -> f acc prev x, x) (v, x1) l in
    f acc xn x1

(*
  - on traite de façon particulière le cas d'une liste à 0 ou 1 élément
    (auquel cas on ne fait rien)

  - sinon, on utilise un accumulateur qui contient la valeur calculée
    d'une part et le dernier élément rencontré d'autre part
*)

This document was generated using caml2html