(* Sa se desparta o lista intr-o lista de fragmente de cate k elemente *)

(* Ca prim pas e util sa facem o functie care returneaza o pereche:
   primele (cel mult) k elemente si restul listei *)

(* Scriem o functie auxiliara cu acumulator in care vom pune
   primele elemente in ordine inversa, decrementand si contorul *)

let rec prime r k = function
  | h :: t when k > 0 -> (* mai avem elemente si in lista si de luat *)
     prime (h::r) (k-1) t         (* pune primul element in acumulator *)
  | lst -> (List.rev r, lst)        (* altfel (lista vida sau k = 0) returneaza
                                   acumulatorul inversat si lista ramasa *)

(* solutia are tot un acumulator pentru lista de liste
   desparte la fiecare pas primele k *)
let fragment k =        (* k constant ramane parametru la functia exterioara *)
  let rec frag2 r = function        (* functia ajutatoare are acumulatorul r *)
    | [] -> List.rev r                (* gata, returnam acumulatorul inversat *)
    | lst -> let (prim, rest) = prime [] k lst        (* sigur macar o bucata *)
             in frag2 (prim :: r) rest        (* acumulam fragmentul si continuam *)
  in frag2 []
;;
fragment 3 [1;2;3;4;5;6;7]    (* [[1; 2; 3]; [4; 5; 6]; [7]] *)

This document was generated using caml2html