如何提前退出 while 循环

How to exit a while loop prematurely

假设我有一个无限的 while 循环,我想退出循环。这样做的正确方法是什么? OCaml 没有 break,因此我可能不得不引发异常以终止循环 (try while true do ... raise My_exception ... done with My_exception -> ())。这是退出无限循环的惯用方式吗?我应该在循环中引发哪个异常?

您可以使用本地异常来确保循环内的函数调用不会干扰您的控制流:

let exception Early_exit in
try while ...
   raise Early_exit
done;
...
with Early_exit -> ...

Is this the idiomatic way to exit infinite loops?

是的,这是一种相当惯用的退出 non-idiomatic 无限循环的方法。甚至还有一个随时可用的例外,称为 Exit1,例如,

let main () =
  try while true do
      let continue = work () in
      if not continue then raise Exit;
    done
  with Exit -> ()

话虽如此,编码无限循环的惯用且正确的方法是使用递归。它不仅更易读,而且具有自然的退出循环方式,例如函数式样式中相同的无限循环,

let rec main () =
  if work () then main ()

1) 尽管最好像@octachron 那样定义自己的异常,以避免与也依赖于此异常的其他代码发生冲突的可能性。