从 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
,那么对于代码的清晰度和性能来说会更好。没有足够的背景,我们无法判断哪个最适合您。
我是 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
,那么对于代码的清晰度和性能来说会更好。没有足够的背景,我们无法判断哪个最适合您。