首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >!=在OCaml中有意义吗?

!=在OCaml中有意义吗?
EN

Stack Overflow用户
提问于 2009-09-11 18:50:00
回答 2查看 35K关注 0票数 67

这似乎是某些类型的等价性比较,但不是字符串。

# 3 != 3;;
- : bool = false
# 3 != 2;;
- : bool = true

这和预期的一样。

# "odp" = "odp";;
- : bool = true
# "odp" != "odp";;
- : bool = true
# "odp" <> "odp";;
- : bool = false

为什么"odp" != "odp"的计算结果是true?它到底在做什么?它不应该生成一个类型错误吗?

EN

回答 2

Stack Overflow用户

发布于 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

到目前为止,一切都很好:xt.(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 ...

检查t1t2的物理相等性是检测它们在结构上明显相等的一种快速方法,甚至不必递归和读取它们。这就是:

let equal t1 t2 =
  if t1 == t2
  then true
  else 
    match ...

如果您记住在OCaml中“布尔或”运算符是“惰性的”,

let equal t1 t1 =
  (t1 == t2) ||
  match ...
票数 14
EN

Stack Overflow用户

发布于 2009-09-11 19:06:12

整数是唯一物理相等和结构相等的类型,因为整数是唯一未装箱的类型

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1412668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档