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;;
正是我在找什麼,謝謝! –
這是思考模式匹配的正確方法,但據我所知,沒有實際保證匹配將以這種方式實現。只要可觀察結果相同,編譯器和運行時就可以執行任何操作。新價值的構建沒有明顯的副作用,因此理論上可能會發生。 (但事實並非如此。) –
你也可以將你的數據類型定義看作是用相同的名字創建一個*值構造函數*和一個*模式構造函數*,其中後者實際上是一個*值析構函數*破壞價值的一部分(以便訪問其屬性)。 –