OCaml - 两个哈希表和函数与嵌套标记参数的相等性

时间:2017-06-18 01:15:22

标签: ocaml

我想比较两个哈希表的相等性:

open Core.Std

let hashtables_equal (x_tbl: ('a, 'b) Hashtbl.t) (y_tbl: ('a, 'b) Hashtbl.t) : bool =
  (Hashtbl.length x_tbl = Hashtbl.length y_tbl)
  && Hashtbl.for_alli x_tbl ~f:(fun ~key ~data -> Hashtbl.existsi y_tbl ~f:(fun ~k ~d -> k = key && d = data))

ffor_alli中的existsi函数有两个标记的参数~key~data

由于使用了不正确的标签,上面的代码无法编译。但是,我想在嵌套函数中引用~key~data标记的参数。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您可以为带标签的参数指定本地名称,您无需使用标签本身作为名称。

let hashtables_equal x_tbl y_tbl =
    Hashtbl.length x_tbl = Hashtbl.length y_tbl &&
    Hashtbl.for_alli x_tbl ~f: (fun ~key ~data ->
        Hashtbl.existsi y_tbl ~f:(fun ~key:k ~data:d ->
           k = key && d = data))

对于它的价值,Core中似乎有一个函数比较哈希表的相等性:

let hashtables_equal x_tbl y_tbl = Hashtbl.equal x_tbl y_tbl (=)

在这种情况下,最后一个参数(=)用于比较元素,以防通常的比较不是您想要的。 (因为它不适用于哈希表,作为一个例子。)