Если вы хотите придерживаться императивного стиля, вы можете использовать исключение для выхода из цикла:
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
Но, как правило, как уже писал ppl, функциональный стиль в 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
В этом примере между этими двумя версиями нет большой разницы, но использование исключений для выхода из циклов / рекурсий следует использовать с осторожностью; с ними можно довольно легко вносить ошибки потока управления, а иногда их трудно отлаживать.
Кстати, вы можете использовать Array.unsafe_get heap i для ускорения доступа к вашему массиву, так как вы можете быть уверены, что i всегда находится в допустимом диапазоне массива в приведенных выше примерах. (О, нам нужно дополнительно проверить начало> = 0.)