我理解这x == y是错误的,因为每个都是在不同的内存位置实例化的(/sf/answers/98888191/)。但我的预期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? *)
Run Code Online (Sandbox Code Playgroud)
考虑物理相等 ( ==) 的一种方法是比较给定值的地址。不同内存位置中的值具有不同的地址,即使它们的值在结构上相同,但物理上也不相等。
然而,int 是 OCaml 实现中的立即值。换句话说,不涉及地址。int 本身(以标记格式)出现在您可能期望地址所在的位置。这意味着任何两个结构上相等 ( =) 的 int 物理上也相等 ( ==)。
另一种说法是整数没有装箱(在您的实现中以及在我见过的所有实现中)。
其他整数值被框起来。(请注意44l= 44 L,一个 int32 常量):
# 44l;;
- : int32 = 44l
# 44l = 44l;;
- : bool = true
# 44l == 44l;;
- : bool = false
Run Code Online (Sandbox Code Playgroud)
编辑
正如@octachron所说,你真的不应该编写==对不可变值使用物理相等()的代码。
除了暗示==之外,无法保证 on 不可变值的行为。a == ba = b
另一个重要的一点是,不可变值没有指定物理相等性。的结果
let xl = [0]
let yl = [0]
let whatever = xl == yl
Run Code Online (Sandbox Code Playgroud)
将取决于代码的编译(或解释)方式,更一般地取决于应用或不应用哪些编译器优化。通常,对于最新版本的 OCaml,您的字符串示例x==y可能会返回 true,因为自 OCaml 4.06 以来字符串默认是不可变的。
换句话说,您无法==确定两个值是否使用相同的绑定定义,因为此概念不是 OCaml 语言的一部分,并且编译器优化不会保留该概念。