ocaml - 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? *)
解决方案
考虑物理相等 ( ==
) 的一种方法是比较给定值的地址。不同内存位置的值具有不同的地址,即使它们的值在结构上相同,它们也会在物理上不相等。
但是 int 是 OCaml 实现中的直接值。换句话说,不涉及地址。int 本身(以标记格式)出现在您可能期望地址所在的位置。这意味着任何两个结构上相等的整数 ( =
) 在物理上也是相等的 ( ==
)。
另一种说法是整数没有装箱(在您的实现和我见过的所有实现中)。
其他整数值加框。(注意44l
= 44 L,一个 int32 常量):
# 44l;;
- : int32 = 44l
# 44l = 44l;;
- : bool = true
# 44l == 44l;;
- : bool = false
编辑
正如@octachron 所说,您真的不应该编写==
在不可变值上使用物理相等()的代码。
除了暗示之外,不保证==
不可变值的行为。a == b
a = b
推荐阅读
- c# - 如何向我的 c# windows 窗体应用程序添加访问权限?
- java - 找不到文件eclipse问题
- python - Python中写入csv的多处理问题
- vb.net - ChromeDriver 占用磁盘空间
- python - 如何收集响应页面中的字段值并将其保存在列表中?
- android - 无法从 json 获得响应
- python - 无法打印 ASCII 艺术
- android - Flutter - TabBar 的第一个选项卡未正确定位
- c# - 如何在 C# 中为我的结构重载 Double.Equals()?
- python - 为什么 VS Code + Anaconda 在 Windows 上这么慢