【问题标题】: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;;

【问题讨论】:

    标签: ocaml


    【解决方案1】:

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

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

    【讨论】:

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