如何`val hash:'a - > int`是在OCaml中实现的?

时间:2013-03-22 17:16:23

标签: functional-programming ocaml

在OCaml中,Hashtbl可以hash任何东西到int

  

Hashtbl.hash x将非负整数与任何类型的任何值相关联。保证如果x = y或Pervasives.compare x y = 0,则hash x = hash y。而且,哈希总是终止,即使在循环结构上也是如此。

我的意思是,在Java中,对于返回整数的每个对象,我们都有hashCode(),而Java的Hashtable可以散列该整数。

但OCaml是如何实现这一点的呢?

1 个答案:

答案 0 :(得分:6)

这并不棘手。 Hashtbl.hash只是以类似于垃圾收集器的方式遍历数据。它以固定的距离进入链接结构,避免了在有周期时失败。它对它遇到的高级类型一无所知,它只是散列它所达到的原始值。

您可以在OCaml源代码分发中看到byterun / hash.c中的代码。

<强>更新

我可能一直在询问如何在OCaml 中实现Hashtbl.hash 。答案是它无法在OCaml中实现(没有作弊),因为它违反了参数。类型'a -> int唯一可能的纯函数是返回常量值的函数。直觉是这样的函数不能使用有关其参数的任何信息,因为它是为所有可能的类型定义的。

Hashtbl.hash是一些违反参数的OCaml函数之一。它们存在于OCaml中,因为它们非常方便。另一个臭名昭着的是多态比较compare(以及相关的=运算符)。