4

OCamlのオプション型は、何も返さない可能性のある関数がある場合に非常に役立ちます。しかし、これを多くの場所で使用するSomeと、ケースとNoneケースを常に処理するのが面倒になりmatch ... withます。

例えば、

let env2 = List.map (fun ((it,ie),v,t) ->
  match t with
  | Some t -> (v,t)
  | None   ->
    begin
      match it with
      | Some it -> (v,it)
      | None    -> failwith "Cannot infer local vars"
    end) ls_res in

オプションタイプを簡潔に分解する他の方法はありますか?

4

3 に答える 3

10

単純なケースでは、一度に複数のものを照合できます。

match t, it with
| Some t, _ -> (v, t)
| None, Some it -> (v, it)
| None, None -> failwith "Cannot infer local vars"

これは私がいつもしていることです。コンパイラはこの構成に適していると言われています (実際には余分なペアを生成しません)。

于 2013-02-20T14:49:59.533 に答える
1

やりたいことに応じて、これらに対処するのに役立つさまざまなことを書くことができます。このパターンでは、次のような記述をお勧めします。

let or_else opt1 opt2 = match opt1 with 
  | Some _ -> opt1
  | None -> opt2

そして、コードを次のように再構築します。

let env2 = List.map (fun ((it,ie),v,t) ->
  match (or_else opt1 opt2) with
  | Some t -> (v,t)
  | None   -> failwith "Cannot infer local vars") ls_res in

この数よりも多くのオプションがある場合は、or_elseそれらをリストに折りたたむことができます。

let a = [None; None; Some 1; Some 2;];;
List.fold a ~init:None ~f:or_else;;
于 2013-02-20T14:31:49.147 に答える
0
  • オプションモナド(別名。多分モナド)。JustHaskellSomeではOCamlにありNothing、HaskellではOCamlにあることに注意してくださいNonehttp://en.wikipedia.org/wiki/Option_type#The_option_monad
  • 高階関数:default : 'a -> 'a option -> 'a、、、別の回答のように、、などmap_option : ('a -> 'b) -> 'a option -> 'b option。私の名前は標準ではない可能性があります。or_elsemap_some : ('a -> 'b option) -> 'a list -> 'b listconcat_some : 'a option list -> 'a list
  • 困ったらunsome : 'a option -> 'a、、let unsome = function Some a -> a | None -> raise Not_found。実際、これは、広範囲にわたる例外を処理するための高階関数がある場合に役立ちますNot_found
于 2013-02-20T21:48:27.627 に答える