抱歉,我不确定如何为此问题提供正确的标题: 如果我这样做:
let f1= function 1 -> failwith "a" | s ->s;;(*you can just use f1 x=x, just want to let f1 to have an exception case*)
let f2 =
let f1=
try(print_string "s1";f1)
with _ -> (print_string "s2" ;failwith "s3")
in
let conv tm = f1 tm
in conv;;
let f3 =
let conv tm =
let f1=
try(print_string "s1";f1)
with _ -> (print_string "s2" ;failwith "s3")
in
f1 tm
in conv;;
现在我对正在发生的事情感到有些困惑。 f1实际上是重新定义的,即使在f2中也是如此,因为如果我们这样做了
let f4 =
let f1= ()
in
let conv tm = f1 tm
in conv;;
将发生类型检查错误。
我正在使用ocaml 4.01.0
答案 0 :(得分:1)
仅在实际调用f1
时抛出异常。但是,您不会在try
块中调用它 - 在f2
或f3
中 - 您只需评估其中的引用并将返回值分配给您的本地f1
变量。导致异常的实际调用始终为f1 tm
。
你似乎在寻找
let f4 tm = try
print_string "s1";
f1 tm
with
_ -> print_string "s2";
failwith "s3";;