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

时间:2016-06-12 16:57:22

标签: function ocaml equality caml

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

例如,有一个

# print_string == print_string;;
- : bool = true

但令人惊讶的是,

# (==) == (==);;
- : bool = false

此表达式应评估为true

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

1 个答案:

答案 0 :(得分:5)

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

  

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

由于函数不可变,唯一的保证是如果它们与compare相等,它们也会与compare进行比较。由于无法保证函数与==具有可比性,因此这实际上意味着# compare (==) (==);; Exception: Invalid_argument "equal: functional value". 对于比较函数毫无用处。

==

如果false为不可变值返回==,则根本没有保证。这意味着false可以随时为任何不可变值返回false。因此,在第二个例子中返回... contents.setFont(font, 12); // Loop to create 25 lines of text for (int i = 0; i < 25; i++) { int ty = 700 + y * 15; contents.beginText(); contents.newLineAtOffset(100, ty); contents.showText(message + " " + Integer.toString(i)); System.out.println(message + " " + Integer.toString(i)) contents.endText(); } ... 并不合适。