utop # [1;2];;
- : int list = [1; 2]
utop # 1::2::[];;
- : int list = [1; 2]
utop # 1::2::[] == [1;2];;
- : bool = false
虽然单独评估的两个表达式看起来相同,但为什么OCaml相等函数返回false?
答案 0 :(得分:19)
==
运算符不代表结构相等,但代表物理相等。在类C语言中,它不会比较值而是指针。在非可变值上使用它通常是不明智的(除非你正在进行记忆)。
引用OCaml manual:
e1 == e2
测试e1
和e2
的物理平等。在可变类型(如引用,数组,字节序列,具有可变字段的记录和具有可变实例变量的对象)上,当{且仅e1 == e2
的物理修改也影响e1
时,e2
为真。在非可变类型上,( == )
的行为依赖于实现;但是,保证e1 == e2
隐含compare e1 e2 = 0
。
现在,如果您尝试使用测试结构相等性的=
运算符。
utop # 1::2::[] = [1;2];;
- : bool = true