2016-04-24 62 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

你也可以将你的数据类型定义看作是用相同的名字创建一个*值构造函数*和一个*模式构造函数*,其中后者实际上是一个*值析构函数*破坏价值的一部分(以便访问其属性)。 –