Jef*_*eld 12
问题不在于价值观,问题在于物质平等==.除了某些特定的保证外,它的含义是依赖于实现的.
在通常的OCaml实现中,浮动值被加框,因此没有两个float类型的值在物理上相等是正常的.
相反,int值不会加框,因此两个相等的int值在物理上是相等的.
除非你非常确定你知道自己在做什么,否则不应该使用身体平等.它违反了函数式语言的许多所需属性,例如引用透明性,就像在这种情况下一样.
更新:==Pierre Chambart在其出色的答案中给出了具体含义的保证.
Pie*_*art 11
物理相等(==)的语义是:
x == ytrue表示compare x y为0(通常表示x = y)x == y当且且仅当mutating x也会影响y时为true这就是全部,不要假设其他任何事情.(见{ 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在本机代码中生效,但在字节码中不生效)