2016-04-24 27 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值。它只是檢查x是否爲Bar的值。

+0

正是我在找什麼,謝謝! –

+0

這是思考模式匹配的正確方法,但據我所知,沒有實際保證匹配將以這種方式實現。只要可觀察結果相同,編譯器和運行時就可以執行任何操作。新價值的構建沒有明顯的副作用,因此理論上可能會發生。 (但事實並非如此。) –

+1

你也可以將你的數據類型定義看作是用相同的名字創建一個*值構造函數*和一個*模式構造函數*,其中後者實際上是一個*值析構函數*破壞價值的一部分(以便訪問其屬性)。 –

相關問題