从OCaml中的Hashtbl获取元素

从OCaml中的Hashtbl获取元素,ocaml,hashtable,Ocaml,Hashtable,我是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.f

我是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"
我有一个整数
n
(可以变成
字符串
),我有一个哈希表
字符串;int
。我希望能够在哈希表的第n种情况下获取元素,但我不知道如何做到这一点:/

我试图通过查看来查找字符串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 


您正在尝试对值使用Hashtable.find

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

val var\u of_string:(string,int)Hashtbl.t
是一个表,其键为
string
。您可以使用
string
键添加/替换/删除/查找
int
值。在代码中执行相反的操作:使用
int
键尝试查找
string
值。这是错误的。如果要从变量的id号中查询变量的名称,则需要一个类型为
(int,string)Hashtbl.t
的表,例如
string\u of_var


一种可能的方法是从字符串的
var\u
构建这个反向表。通过使用
Hashtbl.iter
var\u of_string
中迭代绑定,很容易实现。但是,如果您可以直接构建
string\u of_var
,而不使用
var\u of_string
,那么代码的清晰度和性能会更好。如果没有足够的背景,我们无法判断哪一种最适合您。

但是'Hashtbl.find var_of_string of_string of_int(n)`也不起作用:/I认为我根本不知道如何使用它:/基本上在另一种语言中,我希望能够使用:string of_int(Hashtbl.find var_of_string of_string of_int(n))
val find : ('a, 'b) t -> 'a -> 'b