OCaml空全局变量

时间:2009-12-29 08:31:41

标签: ocaml

我想知道如何定义一个空的! OCaml中Hashtbl类型的全局变量? 我不想使用Hashtbl.create,因为我不知道它的初始大小,我不想因性能原因猜测初始大小。

基本上这个Hashtbl变量将在函数中被赋予一个真正的Hashtbl,然后这个变量将在其他函数之间共享,所以我不想一直把它作为参数传递,因此我希望它是全球性的。

谢谢,

Spasski

2 个答案:

答案 0 :(得分:6)

OCaml中的哈希表会根据需要增长,所以你最初可以给出最好的猜测,例如:

module A

let hash = Hashtbl.create 123;;

...

let exceed_hash () = 
         for i = 1 to 555 do 
               Hashtbl.add hash i (string_of_int i) 
         done;;

虽然您超过了初始数字,但它也能顺利运行,请查看本教程以获取更多信息http://www.ocaml-tutorial.org/hashtbl

答案 1 :(得分:5)

你要求的是可能的。您可以定义全局引用(这允许您稍后将其分配)到哈希表选项(这允许您首先保持未初始化)。定义如下:

let hashtable = ref None

初始化将是:

hashtable := Some (Hashtbl.create n)

要使用它,您还必须解释如果尚未初始化它会发生什么:

match !hashtable with 
  | None -> assert false
  | Some h -> frobnicate h

在实践中,未初始化的变量违背了OCaml的理念,只会让你的生活更加艰难。我强烈建议你不要使用这种方法。我的两个建议是:

  • 确定创建具有猜测大小的哈希表所导致的性能损失。开销可能比你想象的要小得多。

  • 到处传递哈希表。它是一个参数,比选项参考短......

  • 将哈希表和函数放在一个类中。