type 'a result =
Success of 'a
|Failed of exn
let finally f x cleanup =
let result =
try Success (f x) with
exn ->
Failed exn
in
cleanup ();
match result with
Success y -> y
|Failed exn -> raise exn
有几个地方我不明白:
finally
exn是一种类型,我们如何在模式匹配中使用它? exn失败?
成功(f x)与exn?
清理与f x之间的关系。
答案 0 :(得分:0)
假设使用最终会使用类似的东西:
let h = open_db () in
let f db = ... return someting from db in
let res = finally f h (fun () -> close_db h) in
exn是一种类型,但类型和值的名称空间几乎不在OCaml中混合。因此,当您编写Failed exn
exn
时,名称绑定
Success (f x)
期间出现异常,则不会返回 f x
。
x
是您应该在最终分支中释放的资源,f
可以使用已创建的x