2016-11-23 78 views
2
utop # [1;2];; 
- : int list = [1; 2] 
utop # 1::2::[];; 
- : int list = [1; 2] 
utop # 1::2::[] == [1;2];; 
- : bool = false 

虽然两个表达式分别评估看起来相同,为什么OCaml相等函数返回false?为什么1 :: 2 :: []和[1; 2]在OCaml中的==不一样?

+0

请重新设置此代码的格式。 –

+5

我不知道什么ocaml,但与在线解释器我评估1 :: 2 :: [] == 1 :: 2 :: [] ;;;返回false。这让我认为==运算符测试操作数是否是相同的对象引用,而不是如果它们是等于。我不知道ocaml行话,我希望我的意思很清楚。 – Eineki

+1

请注意,对于* most *语言,这是正确的,引用类型几乎总是通过指针比较进行测试。如果默认值是对容器内容的深度比较,那么预测性能将非常困难。 –

回答

19

==操作并不代表结构平等但物理平等。在C语言中,它不会比较数值,而是比较指针。通常不建议将它用于非可变值(除非您正在进行记忆)。

引述OCaml manual

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

现在,如果您尝试使用测试结构相等性的=运算符。

utop # 1::2::[] = [1;2];; 
- : bool = true