OCaml 物理和结构平等

asp*_*dro 2 ocaml ml

我理解这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)

Jef*_*eld 7

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

然而,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


oct*_*ron 5

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

let xl = [0]
let yl = [0]
let whatever = xl == yl
Run Code Online (Sandbox Code Playgroud)

将取决于代码的编译(或解释)方式,更一般地取决于应用或不应用哪些编译器优化。通常,对于最新版本的 OCaml,您的字符串示例x==y可能会返回 true,因为自 OCaml 4.06 以来字符串默认是不可变的。

换句话说,您无法==确定两个值是否使用相同的绑定定义,因为此概念不是 OCaml 语言的一部分,并且编译器优化不会保留该概念。