除了已经提供的所有正确答案之外,还有关于 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 ...