Fonctions du module Array (Ocaml)

Les fonctions Array.length et Array.make ne sont pas réécrivables. Array.filter n'existe pas.

(* Copie d'un tableau ie Array.copy *)
let copy a =
  let n = Array.length a in
  let r = Array.make n a.(0) in
  for i = 0 to n - 1 do
    r.(i) <- a.(i)
  done;
  r
(* La copie créée est indépendante de l'original *)

(* Création d'une matrice m x n remplie avec x ie Array.make_matrix *)
let make_matrix m n x =
  let r = Array.make m [||] in
  for i = 0 to m - 1 do
    r.(i) <- Array.make n x
  done;
  r

(* Initialise un tableau avec f ie Array.init *)
let init n f =
  if n < 0 then invalid_arg "init";
  let r = Array.make n (f 0) in
  for i = 0 to n - 1 do
    r.(i) <- f i
  done;
  r

(* Test si un élément est présent ie Array.mem *)
let mem x a =
  let n = Array.length a in
  let rec loop i =
    i < n && (a.(i) = x || loop (i + 1))
  in
  loop 0

(* Test si au moins un élément satisfait p ie Array.exists *)
let exists p a =
  let n = Array.length a in
  let rec loop i =
    i < n && (p a.(i) || loop (i + 1))
  in
  loop 0

(* Test si tous les éléments satisfont p ie Array.for_all *)
let for_all p a =
  let n = Array.length a in
  let rec loop i =
    i >= n || (p a.(i) && loop (i + 1))
  in
  loop 0

(* Sous-tableau de a à partir de i de longueur len ie Array.sub *)
let sub a i len =
  if i < 0 || len < 0 || i + len > Array.length a then invalid_arg "sub";
  let r = Array.make len a.(i) in
  for k = 0 to len - 1 do
    r.(k) <- a.(i + k)
  done;
  r

(* Applique f à chaque élément ie Array.iter *)
let iter f a =
  let n = Array.length a in
  for i = 0 to n - 1 do
    f a.(i)
  done