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;;
正是我在找什么,谢谢! –
这是思考模式匹配的正确方法,但据我所知,没有实际保证匹配将以这种方式实现。只要可观察结果相同,编译器和运行时就可以执行任何操作。新价值的构建没有明显的副作用,因此理论上可能会发生。 (但事实并非如此。) –
你也可以将你的数据类型定义看作是用相同的名字创建一个*值构造函数*和一个*模式构造函数*,其中后者实际上是一个*值析构函数*破坏价值的一部分(以便访问其属性)。 –