在OCaml中有!=有意义吗?

Nic*_*ner 62 ocaml

它似乎是某些类型的等效比较,但不是字符串.

# 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)

检查t1t2物理平等是一种快速的方法来检测它们显然在结构上是平等的,甚至不必递归和读取它们.那是:

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)