Nếu bạn muốn gắn bó với phong cách bắt buộc, bạn có thể sử dụng một ngoại lệ để thoát khỏi vòng lặp:
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
Nhưng nói chung, như ppl đã viết, phong cách chức năng là hơn ưa thích trong 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
Trong ví dụ này, không có nhiều khác biệt giữa hai phiên bản, nhưng việc sử dụng ngoại lệ cho các vòng lặp/thu thập phải được sử dụng cẩn thận; bạn có thể giới thiệu các lỗi luồng kiểm soát khá dễ dàng với chúng và đôi khi chúng khó gỡ lỗi.
BTW, bạn có thể sử dụng Array.unsafe_get heap i để tăng tốc độ truy cập mảng của bạn vì bạn có thể chắc chắn rằng tôi luôn nằm trong phạm vi hợp lệ của mảng các ví dụ trên. (Oh, chúng ta cần bắt đầu> = 0 check in Ngoài ra, mặc dù.)
Bởi "ngoại lệ được precomputed", bạn có nghĩa là thêm 'let exit = Exit' trước khi vòng lặp là những gì ngăn ngừa một số không hiệu quả ở đây? Điều này vẫn sẽ là trường hợp với một trình biên dịch OCaml gần đây? – anol