打破OCaml中的循环

时间:2013-06-05 10:31:03

标签: exception exception-handling ocaml

我经常需要在OCaml中打破一个循环,至少有两种方法:

(* by exception *)
try
  for i = 0 to 100 do
    ...
    if cond then raise BreakLoop
  done;
...
with BreakLoop -> ...

(* by while *)
let cond = ref false in
let i = ref 0 in
while (not !cond) && (i<= 100) do
  ...
  i := !i + 1
done;
if !cond then ...

我最关心的是优化运行时间,只要程序易于阅读和理解即可。当存在多个嵌套循环时,while使循环变得复杂。

我在互联网上的某个地方看到,在OCaml中抛出和捕获异常代价很高。任何人都可以确认我是否属实?

因此我们有时应该采用while方式,有时使用exception方式?

1 个答案:

答案 0 :(得分:5)

与其他语言相比,ocaml中的异常非常快(只要你使用原始编译器。对于js_of_ocaml,ocaml-java等,情况就不同了。)

然而,具有compilicated while循环的解决方案仍然会更快一点。我不关心最小速度差异,如果代码更容易阅读,例外 - 至少在大多数情况下。