Functional programming “val hash:';a->;int`是在OCaml中实现的吗?

Functional programming “val hash:';a->;int`是在OCaml中实现的吗?,functional-programming,ocaml,Functional Programming,Ocaml,在OCaml中,Hashtbl可以hash将任何事物都转换为int Hashtbl.hash x将非负整数与任何类型的任何值相关联。可以保证,如果x=y或pervisives.compare x y=0,则hash x=hash y。此外,即使在循环结构上,散列也总是终止 我的意思是,在Java中,每个返回整数的对象都有hashCode(),Java的哈希表可以对该整数进行哈希运算 但是OCaml是如何实现哈希的呢?这并不难Hashtbl.hash只是以类似于垃圾收集器的方式遍历数据。它在链接结

在OCaml中,
Hashtbl
可以
hash
将任何事物都转换为int

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

我的意思是,在
Java
中,每个返回整数的对象都有
hashCode()
,Java的哈希表可以对该整数进行哈希运算


但是OCaml是如何实现哈希的呢?

这并不难
Hashtbl.hash
只是以类似于垃圾收集器的方式遍历数据。它在链接结构中移动固定距离,从而避免出现循环时发生故障。它不知道它遇到的高级类型,它只是散列它到达的原语值

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

更新

我突然想到,您可能会问,
Hashtbl.hash
是如何在OCaml中实现的。答案是它不能在OCaml中实现(没有欺骗),因为它违反了参数化。类型为
'a->int
的纯函数只能返回常量值。直觉是这样一个函数不能使用任何关于它的参数的信息,因为它是为所有可能的类型定义的


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

谢谢,我只是添加了散列的链接。c:Jeffrey,你能告诉我,如果我们要将整数映射到0到M-1,为什么我们通常选择M作为素数或2的幂吗?素数:将值分布得更好(每件事都相对重要)。2的威力:通过掩蔽很容易计算。抱歉,杰弗里,我不确定我是否理解你的更新。什么是参数性?在一种具有参数多态性的语言(FP语言)中,parametricity指的是你可以从类型中推断函数属性的原理。至少这就是我在这里的意思!正如我所说,直觉是函数不能“查看”它的多态参数,因为它不知道它们是什么。