OCaml:finally子句相关问题

时间:2013-10-08 15:42:27

标签: ocaml finally

    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

有几个地方我不明白:

  1. finally

  2. 的语法
  3. exn是一种类型,我们如何在模式匹配中使用它? exn失败?

  4. 成功(f x)与exn?

  5. 相匹配
  6. 清理与f x之间的关系。

1 个答案:

答案 0 :(得分:0)

  1. 假设使用最终会使用类似的东西:

    let h = open_db () in
    let f db = ... return someting from db in
    let res = finally f h (fun () -> close_db h) in
    
  2. exn是一种类型,但类型和值的名称空间几乎不在OCaml中混合。因此,当您编写Failed exn exn时,名称绑定

  3. 如果在评估Success (f x)期间出现异常,则不会返回
  4. f x

  5. x是您应该在最终分支中释放的资源,f可以使用已创建的x