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

Sam*_*udo 3 ocaml equality function caml

在Caml中,操作员==测试两个相同类型的值之间的物理相等性.它可以特别用于以这种方式比较功能.

例如,有一个

# print_string == print_string;;
- : bool = true
Run Code Online (Sandbox Code Playgroud)

但是,令人惊讶的是,

# (==) == (==);;
- : bool = false
Run Code Online (Sandbox Code Playgroud)

应该将此表达式计算为true.

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

Jef*_*eld 5

Pervasives模块中==定义了行为:

e1 == e2测试e1和e2的物理相等性.在可变类型,如引用,数组,字节序列,记录与可变领域和对象具有可变实例变量,E1 == E2为真,当且仅当e1的物理改性也影响E2.在非可变类型上,(==)的行为是依赖于实现的; 但是,保证e1 == e2意味着比较e1 e2 = 0

由于函数不可变,唯一的保证是如果它们相等,==它们也会比较等于compare.由于不保证功能可与之比较compare,这实质上意味着==对于比较功能根本没有用处.

# compare (==) (==);;
Exception: Invalid_argument "equal: functional value".
Run Code Online (Sandbox Code Playgroud)

如果==返回false不可变值,则根本没有保证.这意味着可以==随时返回false任何不可变值.所以false在你的第二个例子中返回并不是不合适的.