Function Caml中函数的物理相等性测试

Function Caml中函数的物理相等性测试,function,ocaml,equality,caml,Function,Ocaml,Equality,Caml,在Caml中,运算符=测试同一类型的两个值之间的物理相等性。它尤其可用于以这种方式比较函数 例如,一个人有 # print_string == print_string;; - : bool = true 但是,令人惊讶的是 # (==) == (==);; - : bool = false 此表达式应计算为true 你能解释一下这种行为吗?模块中定义了=的行为: e1==e1和e2物理相等的e2测试。对于可变类型,如引用、数组、字节序列、具有可变字段的记录和具有可变实例变量的对象,e1==

在Caml中,运算符
=
测试同一类型的两个值之间的物理相等性。它尤其可用于以这种方式比较函数

例如,一个人有

# print_string == print_string;;
- : bool = true
但是,令人惊讶的是

# (==) == (==);;
- : bool = false
此表达式应计算为
true


你能解释一下这种行为吗?

模块中定义了
=
的行为:

e1==e1和e2物理相等的e2测试。对于可变类型,如引用、数组、字节序列、具有可变字段的记录和具有可变实例变量的对象,e1==e2为真,当且仅当e1的物理修改也影响e2时。在不可变类型上,==)的行为依赖于实现;但是,可以保证e1==e2意味着比较e1 e2=0

由于函数是不可变的,唯一的保证是如果它们与
==
进行比较,那么它们也将与
比较
进行比较。由于函数不能保证与
compare
进行比较,这本质上意味着
=
对于比较函数根本没有用处

# compare (==) (==);;
Exception: Invalid_argument "equal: functional value".
如果
=
为不可变值返回
false
,则根本没有保证。这意味着对于任何不可变值,
=
可以随时自由返回
false
。因此,在第二个示例中返回
false
并不是不合适的。

(==)
并不是一个可以传递给高阶函数的闭包。它的应用程序直接以内联形式创建。每次需要一个闭包时都会分配一个闭包,当您编写
(==)==(==)
时,会在不同的地址分配两个这样的闭包。如果您希望在当前OCaml实现中使用与打印字符串类似的属性,请为一个闭包指定一个名称,您将强制自己在任何地方使用该闭包:
让phys_等于x y=x==y。这也可能比每次为未应用的
(==)
分配闭包更节省内存。