为什么1 :: 2 :: []和[1; 2]在OCaml中的==不一样?

时间:2016-11-23 11:22:41

标签: functional-programming ocaml

utop # [1;2];;
- : int list = [1; 2]
utop # 1::2::[];;
- : int list = [1; 2]
utop # 1::2::[] == [1;2];;
- : bool = false 

虽然单独评估的两个表达式看起来相同,但为什么OCaml相等函数返回false?

1 个答案:

答案 0 :(得分:19)

==运算符不代表结构相等,但代表物理相等。在类C语言中,它不会比较值而是指针。在非可变值上使用它通常是不明智的(除非你正在进行记忆)。

引用OCaml manual

  

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

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

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