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 中的匹配是不是调用构造函数?的主要内容,如果未能解决你的问题,请参考以下文章