首页 > 解决方案 > OCaml 物理和结构平等

问题描述

我的理解x == y是错误的,因为每个都在不同的内存位置(https://stackoverflow.com/a/1412688/11439260)中实例化。但我预计比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? *)

标签: ocamlml

解决方案


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

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

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

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

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

编辑

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

除了暗示之外,不保证==不可变值的行为。a == ba = b


推荐阅读