ocaml 中的匹配是不是调用构造函数?

Posted

技术标签:

【中文标题】ocaml 中的匹配是不是调用构造函数?【英文标题】:Does matching in ocaml call the constructor?ocaml 中的匹配是否调用构造函数? 【发布时间】:2016-08-17 23:12:50 【问题描述】:

假设我以这种方式在 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;;

【问题讨论】:

【参考方案1】:

匹配是否调用构造函数,或者只是“识别”模式而不调用构造函数?

后者。与Bar z 匹配不会创建新的Bar 值。它只是检查x 是否是Bar 值。

【讨论】:

这是考虑模式匹配的正确方法,但据我所知,并不能保证以这种方式实现匹配。只要可观察到的结果相同,编译器和运行时就可以做他们喜欢的事情。新值的构建没有可观察到的副作用,因此理论上它可能正在发生。 (但事实并非如此。) 您也可以将您的数据类型定义视为创建具有相同名称的 值构造函数模式构造函数,其中后者实际上是值析构函数,因为它解构了值的一部分(为了访问它的属性)。

以上是关于ocaml 中的匹配是不是调用构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

构造函数中的“没有匹配的函数调用”

错误:在 C++ 中没有用于调用构造函数的匹配函数

为啥看似明确的类型提示构造函数调用存在“没有匹配的 ctor”?

如果子类未定义构造函数,是不是会调用父构造函数?

调用Dice :: Dice(类构造函数)没有匹配函数

没有与构造函数调用的匹配函数(T *数据)