【发布时间】:2012-01-23 13:42:57
【问题描述】:
Ocaml 中是否有在测试键相等时使用== 而不是= 的哈希表?
例如:
# type foo = A of int;;
# let a = A(1);;
# let b = A(1);;
# a == b;;
- : bool = false
# a = b;;
- : bool = true
# let h = Hashtbl.create 8;;
# Hashtbl.add h a 1;;
# Hashtbl.add h b 2;;
# Hashtbl.find h a;;
- : int = 2
# Hashtbl.find h b;;
- : int = 2
我想要一个可以区分a 和b 的哈希表。这可能吗?
【问题讨论】:
-
这种哈希比较在与不可变值一起使用时有点脆弱,如您的示例所示。文件说 (==) 的结果在这种情况下取决于实现:请参阅Pervasives module under Comparisons。理论上,编译器或运行时可以使任意两个相等的不可变值在物理上相等。
-
@JeffreyScofield 编译器或运行时也可能导致您期望物理上相等的值不同,这不是理论上的:
let test x = let t = Array.make 1 x in x == t.(0) ;; test 1.0 ;;计算false。只存在于纸面上的 Caml 的多线程 GC 也可能会复制不可变的值。 -
谢谢,这些都是非常有趣的例子,虽然我认为 OP 更关心硬币的另一面。您不能依赖具有唯一物理标识 (a != b) 的不可变值,除非它们不相等 (a b)。通常的解决方案(或我使用过的解决方案)是在您的值中保留一个唯一标识符。当然,这也有助于散列。