2013-06-05 151 views
1

我經常需要打破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的方式呢?

+4

您可能對[this]感興趣(http://caml.inria.fr/mantis/view.php?id=5935)討論。另外請注意,您可以使用異常[Exit](http://caml.inria.fr/pub/docs/manual-ocaml-4.00/libref/Pervasives.html#EXCEPTIONExit),而不是定義自己的。 –

+5

考慮使用尾遞歸:'let rec loop i acc = if i> 100 || cond then acc else loop(i + 1)(f acc)'。但我並不是說「總是這樣做」。 – lukstafi

+3

借調。代碼中有很多不必要的可變性。不要使用循環,只考慮條件滿足時才進行遞歸調用。 –

回答

4

相比於其他語言,例外情況是非常快的ocaml的(只要您使用原始的編譯器。事情是js_of_ocaml不同,ocaml的-Java等)

然而,隨着compilicated解決while-循環仍然會更快一點。我不會關心最小速度差異,如果代碼更容易閱讀,但至少在大多數情況下。

+1

只要不打開堆棧軌跡,它們就會很快。 – rgrinberg