它似乎是某些类型的等效比较,但不是字符串.
# 3 != 3;;
- : bool = false
# 3 != 2;;
- : bool = true
Run Code Online (Sandbox Code Playgroud)
这是预期的.
# "odp" = "odp";;
- : bool = true
# "odp" != "odp";;
- : bool = true
# "odp" <> "odp";;
- : bool = false
Run Code Online (Sandbox Code Playgroud)
为什么"odp" != "odp"评估true?它到底在做什么?它不应该生成类型错误?
nlu*_*oni 93
你经历过结构和物质平等之间的差异.
<>是=(结构相等)为!=是==(物理平等)
"odg" = "odg" (* true *)
"odg" == "odg" (* false *)
Run Code Online (Sandbox Code Playgroud)
是错误的,因为每个都在不同的内存位置实例化,执行:
let v = "odg"
v == v (* true *)
v = v (* true *)
Run Code Online (Sandbox Code Playgroud)
大多数时候你都想用=和<>.
编辑结构和物理相等的时间是等效的:
您可以使用what_is_it函数并找出在结构和物理上都相同的所有类型.如下面的注释中所述,在链接的文章中,字符,整数,单位,空列表和变体类型的某些实例将具有此属性.
P S*_*ved 16
!=操作==员的反面是操作员,而不是操作员=.
# "a" != "a" ;;
- : bool = true
# "a" == "a" ;;
- : bool = false
Run Code Online (Sandbox Code Playgroud)
==运算符是"物理相等".当您键入时 "a" == "a",您比较两个碰巧看起来相似的不同字符串实例,以便操作符返回false.虽然有一个实例使它返回true:
# let str = "a"
in str == str ;;
- : bool = true
# let str = "a"
in str != str ;;
- : bool = false
Run Code Online (Sandbox Code Playgroud)
Pas*_*uoq 12
约一个快速的解释==和!=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
Run Code Online (Sandbox Code Playgroud)
到目前为止,这么好: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
Run Code Online (Sandbox Code Playgroud)
你在这里看到的是涉及浮点数的其他有用优化的结果.
2 /另一方面,有一种安全的使用方式==,这是一种检查结构平等的快速但不完整的方法.
如果要在二叉树上编写相等函数
let equal t1 t2 =
match ...
Run Code Online (Sandbox Code Playgroud)
检查t1和t2物理平等是一种快速的方法来检测它们显然在结构上是平等的,甚至不必递归和读取它们.那是:
let equal t1 t2 =
if t1 == t2
then true
else
match ...
Run Code Online (Sandbox Code Playgroud)
如果你记住在OCaml中"布尔或"运算符是"懒惰的",
let equal t1 t1 =
(t1 == t2) ||
match ...
Run Code Online (Sandbox Code Playgroud)