2016-04-24 3 views
2

のは、私はOCamlの中でこのように型を定義しましょう:ocamlでのマッチングはコンストラクタを呼び出しますか?

type 'a foo = My_none | Bar of 'a;; 

let a = Bar 4;; 

"と呼ばれる" Barコンストラクタを作成するとき。

次の関数では、一致するものがコンストラクタを呼び出すか、または単にコンストラクタを呼び出さずにパターンを「認識」しますか?

let get_bar x = match x with 
    | My_none -> failwith "None" 
    | Bar z -> z;; 

答えて

5

マッチングは、コンストラクタを呼び出す、または単にコンストラクタを呼び出すことなく、パターンを「認識」しますか?

後者。 Bar zと一致させると、新しいBar値は作成されません。 xBarの値であるかどうかをチェックします。

+0

まさに私が探していたものです、ありがとう! –

+0

これはパターンマッチングについて考える正しい方法ですが、私が知る限り、マッチングがこのように実装されるという保証はありません。コンパイラとランタイムは、観測可能な結果が同じであれば好きなように処理できます。新しい価値の構築には、観察可能な副作用がないため、理論的には起こりうる。 (でもそうではありません) –

+1

データ型の定義は、同じ名前の*値コンストラクタ*と*パターンコンストラクタ*を作成するものと考えることができます。後者は実際には*値デストラクタ* (プロパティにアクセスするために)値の一部を破棄します。 –

関連する問題