从 OCaml 中的 Hashtbl 获取元素

Get an element from a Hashtbl in OCaml

我是 OCaml 的新手,所以现在使用现有代码对我来说相当复杂,但不幸的是我需要它。

我有一个变量声明如下:

val var_of_string : (string, int) Hashtbl.t

我想获取一个元素并将其显示在一个函数中。

let rec string_of_id n = match DynArray.get id_to_fml n with
    Lit -> (if n land 1 == 0 then
              string_of_int (Hashtbl.find var_of_string string_of_int(n))
            else 
              "-" ^ string_of_int (Hashtbl.find var_of_string string_of_int(n))
           )
  | And ids ->
      (match ids with
       [] -> "#true#"
     | _ -> "(" ^ String.concat " & " (List.map string_of_id ids) ^ ")")
  | Or ids ->
      (match ids with
       [] -> "#false#"
     | _ -> "(" ^ String.concat " | " (List.map string_of_id ids) ^ ")")
  | Dia (r, n) -> "<" ^ string_of_int r ^ ">" ^ string_of_id n
  | Box (r, n) -> "[" ^ string_of_int r ^ "]" ^ string_of_id n
  | True -> "true"
  | False -> "false"

基本上,唯一重要的部分是:

    Lit -> (if n land 1 == 0 then
              string_of_int (Hashtbl.find var_of_string string_of_int(n))
            else 
              "-" ^ string_of_int (Hashtbl.find var_of_string string_of_int(n))
           )

我有一个整数 n(可以变成 string)并且我有一个哈希表 string ; int。我希望能够在哈希表的第 n 个情况下获取元素,但我不知道该怎么做:/

我通过查看 documentation 尝试 Hashtbl.find var_of_string n,但我收到此错误消息:

Error: The implementation syntax.ml does not match the interface syntax.cmi:
       Values do not match:
         val var_of_string : (int, string) Hashtbl.t
       is not included in
         val var_of_string : (string, int) Hashtbl.t
       File "syntax.ml", line 55, characters 4-17: Actual declaration

看起来我做错了,但我不知道该怎么做:/

在此先感谢您的帮助!

您的哈希表的键是一个字符串,值是一个整数。

Hashtable.find 具有以下签名:

val find : ('a, 'b) t -> 'a -> 'b 

http://caml.inria.fr/pub/docs/manual-ocaml/libref/Hashtbl.html

您正试图对一个值使用 Hashtable.find。

使用(==)进行整数比较是个坏习惯。使用 (=),结构比较代替。 (==)是使用指针的物理比较。对于整数,它们是相同的,但通常它们的行为不同。不小心用(==)总有一天会把你的脚射坏。

val var_of_string : (string, int) Hashtbl.t 是一个 table,它的键是 string。您可以使用 string 键 add/replace/remove/find int 值。在您的代码中,您做相反的事情:尝试使用 int 键查找 string 值。这是错误的。如果您想从变量的 ID 号中查询变量的名称,则需要 table,例如 string_of_var 类型 (int, string) Hashtbl.t

一种可能的方法是从 var_of_string 构建此反向 table。通过使用 Hashtbl.iter 迭代 var_of_string 中的绑定可以轻松完成。但是,如果您可以直接构建 string_of_var 而无需使用 var_of_string,那么对于代码的清晰度和性能来说会更好。没有足够的背景,我们无法判断哪个最适合您。