除了已经提供的所有正确答案之外,还有关于 OCaml 中 == 和 != 的快速解释:
1/ == 和 != 暴露了你真的不想知道的实现细节。示例:
# let x = Some [] ;;
val x : 'a list option = Some []
# let t = Array.create 1 x ;;
val t : '_a list option array = [|Some []|]
# x == t.(0) ;;
- : bool = true
到目前为止,一切都很好:x 和 t.(0) 在物理上是相等的,因为 t.(0) 包含指向 x 指向的同一块的指针。这是实现的基本知识所要求的。但是:
# let x = 1.125 ;;
val x : float = 1.125
# let t = Array.create 1 x ;;
val t : float array = [|1.125|]
# x == t.(0) ;;
- : bool = false
您在此处看到的是涉及浮点数的其他有用优化的结果。
2/ 另一方面,有一种使用== 的安全方法,这是一种快速但不完整的检查结构相等性的方法。
如果你在二叉树上写一个相等函数
let equal t1 t2 =
match ...
检查t1 和t2 的物理相等性是一种快速检测它们在结构上明显相等的方法,甚至无需递归和读取它们。那就是:
let equal t1 t2 =
if t1 == t2
then true
else
match ...
如果你记住,在 OCaml 中,“布尔或”运算符是“惰性的”,
let equal t1 t1 =
(t1 == t2) ||
match ...