是否可以在函数内定义异常

时间:2015-10-23 23:09:18

标签: ocaml

在OCaml中实现“早期退货”的一种方法是通过例外:

exception Exit

let myfunc () = 
    try
      for i = 0 to .... do
        if .. then raise Exit
      done; false
    with Exit -> true

但是,有没有办法在函数体中声明这个Exit异常,所以它的名字对于模块中的其他函数是不可见的?

(* I would like to do this, but it gives a syntax error *)
let myfunc () = 
    exception Exit
    try
      for i = 0 to .... do
        if .. then raise Exit
      done; false
    with Exit -> true

1 个答案:

答案 0 :(得分:3)

是的,您可以使用本地模块:

let myfunc () = 
  let module M = struct exception Exit end in
  try
    for i = 0 to 3 do
      if true then raise M.Exit
    done; false
  with M.Exit -> true

但这种风格并不是特别令人愉快,所以我不推荐它。如果要将其隐藏在程序的其他大部分内容中,则可以省略在下一个模块界面显示Exit