我经常需要在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
方式?
答案 0 :(得分:5)
与其他语言相比,ocaml中的异常非常快(只要你使用原始编译器。对于js_of_ocaml,ocaml-java等,情况就不同了。)
然而,具有compilicated while循环的解决方案仍然会更快一点。我不关心最小速度差异,如果代码更容易阅读,例外 - 至少在大多数情况下。