0
    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. 最終的にの構文

  2. exn は型ですが、パターン マッチングでどのように使用できますか? exnに失敗しましたか?

  3. 成功 (fx) は exn と一致しましたか?

  4. クリーンアップと f x の関係。

4

1 に答える 1

0
  1. use は最終的に次のようなものを使用すると想定されています。

    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)評価中に例外が発生した場合は返されませんf x

  4. x最終ブランチで解放する必要があるリソースでありf、作成されたものでいくつかの作業を行いますx

于 2013-10-08T15:53:44.040 に答える