【问题标题】:OCaml physical and structural equalityOCaml 物理和结构平等
【发布时间】:2021-12-05 01:11:01
【问题描述】:

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

【问题讨论】:

    标签: ocaml ml


    【解决方案1】:

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

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

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

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

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

    编辑

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

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

    【讨论】:

      【解决方案2】:

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

      let xl = [0]
      let yl = [0]
      let whatever = xl == yl
      

      将取决于代码是如何编译(或解释)的,更一般地说取决于应用了哪些编译器优化。通常对于最新版本的 OCaml,您的字符串示例 x==y 可能会返回 true,因为从 OCaml 4.06 开始,默认情况下字符串是不可变的。

      换句话说,您不能使用== 来确定是否使用相同的绑定定义了两个值,因为这个概念不是 OCaml 语言的一部分,编译器优化也不会保留这个概念。

      【讨论】:

        猜你喜欢
        • 2011-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 2010-12-18
        相关资源
        最近更新 更多