2012-09-05 15 views
10

私はOCamlを初めて使っています。私はあなたが 'a'オプションから値を取得する方法を理解しようとしています。 http://ocaml-lib.sourceforge.net/doc/Option.htmlの文書によると、 'a option - >'というタイプのget関数があり、これは私がしたいものです。しかし、私が入力したとき:OCaml Option get

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

なぜこれは機能しませんか?

+3

OCamlのオプションのユーティリティライブラリであるocaml-libのドキュメントを参照してください。もちろん、 'Some'コンストラクタの中の値にアクセスするためのライブラリは必要ありません。 –

答えて

14

OCamlの任意の種類のコンストラクタ内の値を取得する伝統的な方法は、パターンマッチングです。パターンマッチングはOCamlの一部であり、他の言語ですでに見たこととは大きく異なる可能性があるので、慣れ親しんだやり方でプログラムを書くだけではないことをお勧めします(たとえば、ocaml-lib )代わりにそれを試して、あなたがそれを好きかどうかを確認してください。

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

変数contents3が割り当てられていますが、警告を取得されています

警告8:このパターンマッチングは網羅的ではないが。ここでは一致しない値の例 です:一般的なケースではなし

、あなたが内側に見てみたい表現が必ずしもSome cであることを知ることができません。オプションタイプが選択された理由は、通常、その値がNoneになることがあります。ここでは、コンパイラは可能なケースの1つを処理していないことを思い出させます。

「奥行きのある」パターンマッチングが可能で、コンパイラは引き続き排除性をチェックします。あなたはケースSome (None)を忘れてしまったし、コンパイラがとてもわかります。ここ

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

警告8:このパターンマッチングは網羅的なものではなく(int option) optionをとり、この関数を考えてみましょう。一部一致しない値の の例を次に示します。Some None

+4

あなたの最初の例は '' c 'の中の '' c' 'の部分に相当します。 –

+0

この回答では、パターンマッチングのために '' match with''を排他的に使用しています。それを最初に単一の構造に関連付けることは痛い。 –

+0

私はあなたに同意します。だから、このファクトイドをコメントとして追加しました;) –

9

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

# 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 =() 

(あなたは値がNoneとき何をしたいのか を決定する必要がありますが)独自のget関数を書くことができます。

+0

それは良い答えです。この例を拡張するには、xに文字列を保持させて次のようにしましょう: https://gist.github.com/shehaaz/7165109 すべての型を扱う一般的な関数を書くことができます。 – Shehaaz

4

タイプの安全に関する上記のポスターのアドバイスを聞くだけでなく、Option.get(バッテリーbtwで利用可能)などの安全でない機能には通常exnが付いていることに注意してください。好きなら、Option.getまたはOption.get_exnを実装する方法は次のとおりです。

let get_exn = function 
    | Some x -> x 
    | None -> raise (Invalid_argument "Option.get")