reason - 如何在 ReScript 中为任意记录类型实现哈希函数?

标签 reason bucklescript rescript

我是第一次探索 ReScript。我想使用记录类型作为我的键类型来构建 HashMap ,并且我正在寻找有关实现哈希函数的指导。

这是我的 ReScript 代码:

type pointer = { id: string, table: string, spaceId: option<string> }

module PointerHash = Belt.Id.MakeHashable({
  type t = pointer
  let hash = a => 0 /* How do I implement this? */
  let eq = (a, b) => 
    a.id == b.id &&
    a.table == b.table &&
    switch (a.spaceId, b.spaceId) {
      | (Some(aid), Some(bid)) => aid == bid
      | _ => false
    }
})

我查看了文档并进行了在线搜索,但没有找到任何关于如何实现 hash 函数的指南。

在期望您实现hashCode() 的其他编程语言(例如 Java)中,有无处不在的工具来支持组合现有的哈希函数。

class Pointer {
  public final id: String
  public final table: String
  public final @Nullable spaceId: String
  /* omitting constructor, etc */
  @Override
  public int hashCode() {
    // Standard helper for implementing hashCode()
    return Objects.hash(this.id, this.table, this.spaceId);
  }
}

我查看了 implementation of Belt.HashMapString查看是否有任何提示,看起来 HashMapString 使用 caml_hash_mix_string:

external caml_hash_mix_string : seed -> string -> seed  = "caml_hash_mix_string"
external final_mix : seed -> seed = "caml_hash_final_mix"
let hash (s : key) =   
  final_mix  (caml_hash_mix_string 0 s )

访问和组合“哈希混合”函数的最惯用方法是什么?这些是否可以通过 ReScript 的漂亮界面获得?

最佳答案

Hashtbl 模块中有一个内置的多态哈希函数:

let hash: 'a => int

这来自ReScript继承的OCaml标准库。您可以在那里找到文档:https://docs.ocaml.pro/html/LIBRARY.stdlib@ocaml-base-compiler.4.10.0/Stdlib/Hashtbl/index.html#val-hash

关于reason - 如何在 ReScript 中为任意记录类型实现哈希函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67450498/

相关文章:

ocaml - 创建和分配不必要的回调(initialState...)?

nullable - 处理 Js.Nullable 的正确方法是什么?

javascript - 如何在没有突变的情况下按功能创建有效的组?

ocaml - 如何使用 Jane Street 的 Core with Reason?

list - 如何表示非空列表类型

javascript - 模块名称是绑定(bind)中使用的隐藏全局名称

graphics - 重新编写并使用重新处理

reason - 我如何编写一个通用函数来处理 ReScript 中的多种记录类型?

带有多个参数的 Reasonml 类型,错误异常失败 ("nth")