如何提前退出 while 循环

Flu*_*lux 1 ocaml while-loop

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

oct*_*ron 7

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

let exception Early_exit in
try while ...
   raise Early_exit
done;
...
with Early_exit -> ...
Run Code Online (Sandbox Code Playgroud)


ivg*_*ivg 6

这是退出无限循环的惯用方法吗?

是的,这是退出非惯用无限循环的一种相当惯用的方式。甚至还有一个准备就绪的例外,称为Exit1,例如,

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

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

let rec main () =
  if work () then main ()
Run Code Online (Sandbox Code Playgroud)

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