【问题标题】:Why is "1.0 == 1.0" false in Ocaml?为什么“1.0 == 1.0”在 Ocaml 中为假?
【发布时间】:2014-09-19 01:16:06
【问题描述】:

为什么 1 == 1 返回 true 而 1.0 == 1.0 返回 false?

我认为 = 是结构性的,== 是物理性的,所以不应该都返回 false 吗?

【问题讨论】:

标签: ocaml equality


【解决方案1】:

问题不在于价值观,问题在于物理平等==。除了某些特定的保证之外,它的含义是依赖于实现的。

在通常的 OCaml 实现中,浮动值被装箱,因此没有两个 float 类型的值在物理上相等是正常的。

相反,int 值没有装箱,因此两个相等的 int 值在物理上是相等的。

除非您非常确定自己知道自己在做什么,否则不应使用物理平等。在这种情况下,它违反了函数式语言的许多所需属性,例如引用透明性。

更新:对于== 含义的具体保证由Pierre Chambart 在他的出色回答中给出。

【讨论】:

    【解决方案2】:

    物理相等(==)的语义是:

    • 在任何值上,x == y 为真意味着 compare x y 为 0(通常意味着 x = y)
    • 关于可变值如果x == y 为真当且仅当,变异 x 也会影响 y

    仅此而已,不要假设其他任何事情。 (见 {http://caml.inria.fr/pub/docs/manual-ocaml-4.02/libref/Pervasives.html#VAL%28==%29}

    请注意,compare x y = 0 并不完全等同于 x = y,因为 nan 不等于无,包括它自己

    (顺便说一句,自 Ocaml 4.02 起,优化使 1.0 == 1.0 在本机代码中为真,但在字节码中不是)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-19
      • 2013-10-02
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      相关资源
      最近更新 更多