Si usted quiere meter al estilo imperativo, puede utilizar una excepción para salir del bucle:
exception Found of int
let find_free_next heap start =
try
for i = start to Array.length heap - 1 do
match heap.(i) with
| Hdr (Free (h), g) -> raise (Found i)
| _ ->() (* If it is not what you are seeking *)
done;
raise Not_found
with
| Found n -> n
Pero, en general, como PPL ya han escrito, estilo funcional es más preferido en OCaml:
let find_free_next heap start =
let len = Array.length heap in
let rec find i =
if i >= len then None
else
match heap.(i) with
| Hdr (Free h, g) -> Some i
| _ -> find (i+1)
in
find start
En este ejemplo, no hay mucha diferencia entre las dos versiones, pero el uso de excepciones para salir de bucles/recursiones debe usarse con precaución; puede introducir errores de flujo de control con facilidad, y a veces es difícil depurarlos.
Por cierto, puede utilizar Array.unsafe_get heap i para acelerar su acceso a la matriz, ya que puede estar seguro de que siempre estoy en el rango válido de la matriz de los ejemplos anteriores. (Oh, necesitamos empezar> = 0 cheque, además, sin embargo.)
Por "la excepción está precalculada", ¿quiere decir que agregar 'let exit = Exit' antes del bucle es lo que evita algunas ineficiencias aquí? ¿Sería este el caso con un compilador OCaml reciente? – anol