2

OCaml でループを壊す必要があることがよくあります。少なくとも 2 つの方法があります。

(* 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

1 に答える 1

5

他の言語と比較して、ocaml では例外が非常に高速です (元のコンパイラを使用する限り。js_of_ocaml、ocaml-java などでは状況が異なります)。

ただし、コンパイルされた while ループを使用したソリューションは、まだ少し高速です。少なくともほとんどの場合、例外を除いてコードが読みやすい場合は、最小限の速度の違いは気にしません。

于 2013-06-05T10:54:07.733 に答える