3
在Caml中,运算符==
测试同一类型的两个值之间的物理相等性。它可以特别用于以这种方式比较功能。Caml中函数的物理平等测试
一个具有例如
# print_string == print_string;;
- : bool = true
但是,出人意料的是,
# (==) == (==);;
- : bool = false
此表达式应该被评估为true
。
你能解释这种行为吗?
在Caml中,运算符==
测试同一类型的两个值之间的物理相等性。它可以特别用于以这种方式比较功能。Caml中函数的物理平等测试
一个具有例如
# print_string == print_string;;
- : bool = true
但是,出人意料的是,
# (==) == (==);;
- : bool = false
此表达式应该被评估为true
。
你能解释这种行为吗?
的==
该行为是在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
并不合适。
'(==)'不存在作为准备好的封闭,比如传递给一个高阶函数。它的应用程序直接以内联形式创建。每次需要时都会分配闭包,当您编写'(==)==(==)'时,会在不同的地址分配两个闭包。如果你想要'print_string'类似的属性,使用当前的OCaml实现,给一个单独的闭包命名,你将强制自己在任何地方使用:'let phys_equal x y = x == y ;;'。这可能比每次为未应用的'(==)'分配闭包都更具有内存效率。 –