OCaml 物理和结构平等

OCaml physical and structural equality

我认为 x == y 是错误的,因为每个都在不同的内存位置 () 中实例化。但我预计 a == b 是错误的。为什么这是真的?我如何验证有两个不同的 let 绑定?

(* First Examplle *)
let x = "odg"
let y = "odg"

x = y (* true *)
x == y (* false *)

(* Second example *)
let a = 1
let b = 1

a == b (* true, WHY? *)

考虑物理相等性 (==) 的一种方法是比较给定值的地址。不同内存位置的值具有不同的地址,即使它们的值在结构上相同,也会在物理上不相等。

然而,在您的 OCaml 实现中,int 是一个即时值。换句话说,不涉及地址。 int 本身(以标记格式)出现在您可能希望地址到达的位置。这意味着任何两个在结构上相等 (=) 的整数在物理上也相等 (==)。

另一种说法是整数没有被装箱(在你的实现和我见过的所有实现中)。

其他整数值已加框。 (注意44l = 44 L,一个int32常量):

# 44l;;
- : int32 = 44l
# 44l = 44l;;
- : bool = true
# 44l == 44l;;
- : bool = false

编辑

正如@octachron 所说,您真的不应该编写对不可变值使用物理相等性 (==) 的代码。

除了 a == b 暗示 a = b.

之外,无法保证 == 在不可变值上的行为

另一个重点是不可变值没有指定物理相等性。结果

let xl = [0]
let yl = [0]
let whatever = xl == yl

将取决于代码是如何编译(或解释)的,更一般地说,取决于是否应用了哪些编译器优化。通常对于最新版本的 OCaml,您的字符串示例 x==y 可能 return 为真,因为自 OCaml 4.06 以来,默认情况下字符串是不可变的。

换句话说,您不能使用 == 来确定两个值是否使用相同的绑定定义,因为这个概念不是 OCaml 语言的一部分,也不会被编译器优化保留。