Jeśli chcesz trzymać się imperatywem stylu, można użyć wyjątek, aby wyjść z pętli:
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
ale generalnie, jak ppl już napisany, styl funkcjonalny jest bardziej korzystne SML:
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
W tym przykładzie nie ma dużej różnicy między obiema wersjami, ale należy zachować ostrożność przy korzystaniu z wyjątków dla wychodzących pętli/rekurencji; można z nimi łatwo wprowadzać błędy sterowania, a czasem trudno je debugować.
BTW, możesz użyć sterty Array.unsafe_get i, aby przyspieszyć dostęp do tablicy, ponieważ możesz być pewien, że i jest zawsze w prawidłowym zakresie tablicy powyższych przykładów. (Oh, musimy zacząć> = 0 Sprawdź Ponadto, choć.)
Przez "wyjątek jest wstępnie obliczony", masz na myśli to, że dodanie 'let exit = Exit' przed pętlą jest tym, co zapobiega tutaj niektórym nieefektywnościom? Czy nadal miałoby to miejsce w przypadku ostatniego kompilatora OCaml? – anol