在 OCaml 中检查两条记录(通常是两种类型)是否相等的安全且惯用的方法是什么?

问题描述 投票:0回答:1

如果我使用

=
<>
来检查不是
int
类型的两种类型的相等或不等,我正在处理的代码库似乎会抱怨。

我认为这是禁用的,这样我就不会做错事了。如果这是真的,检查两条记录之间(深度)相等性的正确方法是什么?

ocaml
1个回答
2
投票

=
<>
似乎非常适合记录。

# type a = {b: int; c: string};;
type a = { b : int; c : string; }
# {b=42; c="hello"} = {b=42; c="hello"};;
- : bool = true
# {b=42; c="hello"} <> {b=42; c="hello"};;
- : bool = false

对于递归变体类型似乎也非常有效。

# type d = E | F of int * d;;
type d = E | F of int * d
# F (3, E) = F (3, E);;
- : bool = true
# F (3, E) = F (3, (F (8, E)));;
- : bool = false

现在,如果除了

int
之外,这对您不起作用,几乎可以肯定是因为您使用的是不支持多态比较运算符的 Base 库。

如果必须使用 Base,则

Poly
模块包含多态比较运算符。


如果您正在创建其中多个表示形式可能包含应被视为结构相同的数据的类型,则您可能必须提供自己的相等性测试。

例如

type 'a tree = Leaf | Node of 'a * 'a tree * 'a tree

let t1 = Node (2, Node (1, Leaf, Leaf), Node (4, Node (3, Leaf, Leaf), Leaf))

let t2 = Node (3, Node (2, Node (1, Leaf, Leaf), Leaf), Node (4, Leaf, Leaf))

使用

=
测试这些结果不相等。如果两者都是二叉搜索树,那么我们可以将它们转换为列表来测试相等性。 这尚未优化,仅用于简单演示目的。

let rec tree_to_list = function
  | Leaf -> []
  | Node (v, l, r) -> tree_to_list l @ [v] @ tree_to_list r

let trees_eq a b =
  tree_to_list a = tree_to_list b

现在

trees_eq t1 t2
将返回
true
,因为两者都会评估为
[1; 2; 3; 4]

© www.soinside.com 2019 - 2024. All rights reserved.