11

私は OCaml を初めて使用します。'a オプションから値を取得する方法を理解しようとしています。http://ocaml-lib.sourceforge.net/doc/Option.htmlのドキュメントによると、タイプ 'a option -> 'a の get 関数があり、それは私が望むことを行います。しかし、私が入力すると:

# let z = Some 3;;
val z : int option = Some 3
# get z;;
Error: Unbound value get
# Option.get z;;
Error: Unbound module Option

なぜこれが機能しないのですか?

4

3 に答える 3

20

OCaml のあらゆる種類のコンストラクター内で値を取得する伝統的な方法は、パターン マッチングを使用することです。パターンマッチングは OCaml の一部であり、他の言語で既に見たものと最も異なる可能性があるため、慣れ親しんだ方法でプログラムを作成しないことをお勧めします (たとえば、ocaml-lib の問題を回避するなど)。 )代わりに試してみて、気に入るかどうかを確認してください。

let contents = 
   match z with
   Some c -> c;;

変数contentsが割り当てられ3ていますが、警告が表示されます:

警告 8: このパターン マッチングは網羅的ではありません。以下は、一致しない値の例です: なし

一般的なケースでは、内部を調べたい式が必ずしもSome c. オプション タイプが選択された理由は、通常、その値がNone. ここでコンパイラは、考えられるケースの 1 つを処理していないことを思い出させています。

「詳細な」パターン マッチが可能で、コンパイラは引き続き網羅性をチェックします。を取るこの関数を考えてみましょう(int option) option:

let f x =
  match x with
  Some (Some c) -> c
  | None -> 0
  ;;

ここでは、大文字と小文字を区別するのを忘れてSome (None)おり、コンパイラはそのように伝えます。

警告 8: このパターン マッチングは網羅的ではありません。一致しない値の例を次に示します。

于 2012-09-05T19:50:54.603 に答える
10

これを行う通常の方法は、パターン マッチングを使用することです。

# let x = Some 4;;
val x : int option = Some 4

# match x with
  | None -> Printf.printf "saw nothing at all\n"
  | Some v -> Printf.printf "saw %d\n" v;;
saw 4
- : unit = ()

独自の get 関数を作成できます (ただし、値が None の場合に何をしたいかを決定する必要があります)。

于 2012-09-05T19:51:52.967 に答える
5

型の安全性に関する上記のポスターのアドバイスに耳を傾ける必要がありますが、Option.get (バッテリーで利用可能) などの安全でない関数には通常、exn という接尾辞が付いていることに注意してください。興味がある場合は、これが Option.get または Option.get_exn を実装する方法です。

let get_exn = function
  | Some x -> x
  | None   -> raise (Invalid_argument "Option.get")
于 2012-09-09T06:02:00.050 に答える