2016-06-12 81 views
3

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

一个具有例如

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

但是,出人意料的是,

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

此表达式应该被评估为true

你能解释这种行为吗?

+5

'(==)'不存在作为准备好的封闭,比如传递给一个高阶函数。它的应用程序直接以内联形式创建。每次需要时都会分配闭包,当您编写'(==)==(==)'时,会在不同的地址分配两个闭包。如果你想要'print_string'类似的属性,使用当前的OCaml实现,给一个单独的闭包命名,你将强制自己在任何地方使用:'let phys_equal x y = x == y ;;'。这可能比每次为未应用的'(==)'分配闭包都更具有内存效率。 –

回答

5

==该行为是在Pervasives模块中定义:

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

由于功能是不可变的,唯一的保证是,如果他们比较相等同==他们也会比较compare相等。由于函数不能保证与compare相当,这基本上意味着==根本不用于比较函数。

# compare (==) (==);; 
Exception: Invalid_argument "equal: functional value". 

如果==回报false不可变值,也有完全没有保证。这意味着==可随时返回false以获取任何不可变的值。所以在第二个例子中返回false并不合适。