这似乎是某些类型的等价性比较,但不是字符串。
# 3 != 3;;
- : bool = false
# 3 != 2;;
- : bool = true
这和预期的一样。
# "odp" = "odp";;
- : bool = true
# "odp" != "odp";;
- : bool = true
# "odp" <> "odp";;
- : bool = false
为什么"odp" != "odp"
的计算结果是true
?它到底在做什么?它不应该生成一个类型错误吗?
发布于 2009-09-13 09:24:24
除了已经提供的所有正确答案之外,还提供了一个关于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 ...
发布于 2009-09-11 19:06:12
整数是唯一物理相等和结构相等的类型,因为整数是唯一未装箱的类型
https://stackoverflow.com/questions/1412668
复制相似问题