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 语言的一部分,也不会被编译器优化保留。
我认为 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 语言的一部分,也不会被编译器优化保留。