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

Abh*_*mar 2 ocaml functional-programming

utop # [1;2];;
- : int list = [1; 2]
utop # 1::2::[];;
- : int list = [1; 2]
utop # 1::2::[] == [1;2];;
- : bool = false 
Run Code Online (Sandbox Code Playgroud)

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

Pat*_*atJ 19

==操作并不代表结构的平等,但对身体的平等.在类C语言中,它不会比较值而是指针.在非可变值上使用它通常是不明智的(除非你正在进行记忆).

引用OCaml手册:

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

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

utop # 1::2::[] = [1;2];;
- : bool = true
Run Code Online (Sandbox Code Playgroud)