假设我有一个无限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 -> ...
Run Code Online (Sandbox Code Playgroud)
这是退出无限循环的惯用方法吗?
是的,这是退出非惯用无限循环的一种相当惯用的方式。甚至还有一个准备就绪的例外,称为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 所做的那样,以避免与也依赖于此异常的其他代码发生冲突的可能性。