OCaml中的查找表

OCaml中的查找表,ocaml,lookup,Ocaml,Lookup,我想在OCaml中创建一个查找表。该表将有7000多个条目,在查找时(按int)返回一个字符串。用于此任务的适当数据结构是什么?该表是否应该从基本代码中外部化?如果是,如何“包括”可从其程序访问的查找表 谢谢。如果字符串使用连续整数寻址,则可以使用数组 let table : (int,string) Hashtbl.t = Hashtbl.create 8192 否则,您可以使用哈希表(非功能性)或映射(功能性)。要开始使用地图,请尝试: module Int = struct type

我想在OCaml中创建一个查找表。该表将有7000多个条目,在查找时(按int)返回一个字符串。用于此任务的适当数据结构是什么?该表是否应该从基本代码中外部化?如果是,如何“包括”可从其程序访问的查找表


谢谢。

如果字符串使用连续整数寻址,则可以使用数组

let table : (int,string) Hashtbl.t = Hashtbl.create 8192
否则,您可以使用哈希表(非功能性)或映射(功能性)。要开始使用地图,请尝试:

module Int =
struct
  type t = int
  let compare = compare
end ;;

module IntMap = Map.Make(Int) ;;

如果表太大而无法存储在内存中,则可以将其存储在外部数据库中,并使用绑定到、bdb、将表存储在单独的文件中(例如作为数组),只需创建一个包含以下内容的文件
strings.ml

let tbl = [|
    "String 0";
    "String 1";
    "String 2";
    ...7000 more...
|]
使用以下内容编译此文件:

ocamlc -c strings.ml
如中所述,这定义了其他Ocaml模块可以引用的模块
Strings
。例如,您可以启动toplevel:

ocaml strings.cmo
并通过访问数组中的特定位置来查找字符串:

Strings.tbl.(1234) ;;

如果存储在一个数组中(索引是重要的),但存储在一个单独的.ml文件中,我如何才能理解“包括”仅包含查找表/数组的文件?这里“包括”的含义尚不清楚。也许你可以为你想做的事情提供一些伪代码?我所说的“包括”是指从代码中外部化数据,有点像头文件。这在OCaml中是可能的吗?还是不确定你的意思。OCaml有一个独立的编译系统,不需要头文件。只要确保模块在编译时位于include路径中就可以了。bar.ml包含行“let x=[|3;2;1 |];”,foo.ml包含“open bar;;”,在运行ocamlc-c bar.ml然后运行ocamlc-o foo-foo.ml之后,这似乎会导致编译器错误。这里怎么了?打开吧;
openbar:模块名称以大写字母开头
ocamlc
不带
-c
也进行链接:您提供所有需要链接的文件:
ocamlc-o foo bar.cmo foo.ml