Мне часто нужно разорвать петлю в 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
?
Возможно, вас заинтересует [это] (http://caml.inria.fr/mantis/view.php?id=5935) обсуждение. Кроме того, обратите внимание, что вы можете использовать исключение [Exit] (http://caml.inria.fr/pub/docs/manual-ocaml-4.00/libref/Pervasives.html#EXCEPTIONExit) вместо того, чтобы определять свой собственный. –
Рассмотрите возможность использования хвостовой рекурсии: 'let rec loop i acc = if i> 100 || cond then acc else loop (i + 1) (f acc) '. Я не имею в виду «всегда делаю это». – lukstafi
Вторичный. В вашем коде много ненужной изменчивости. Вместо использования цикла рассмотрим только выполнение рекурсивного вызова, если условие выполнено. –