SML / NJ:如何使用HashTable?

时间:2013-11-07 17:06:09

标签: structure hashtable sml smlnj

我真的想在SML中创建一个HashTable,似乎在SML / NJ中已经存在这样的结构。

问题是,我该如何使用它?我还没有完全理解如何在SML中使用结构,我阅读的书中的一些非常基本的例子给出了我甚至不知道如何纠正的错误,因此使用HashTable结构可能是一件容易的事,但是我不知道。如果有人可以解释这一点,那就太好了!

我认为它是这样的:

val ht : string * int HashTable.hash_table = HashTable.mkTable();

???

2 个答案:

答案 0 :(得分:4)

我认为这个想法是创建一个将字符串映射到整数的表。然后你想把它的类型写成(string, int) hash_table(类型hash_table是一个带有两个参数的类型,它们在ML中写成。)

但是你还需要一个哈希函数hash : string -> word和一个字符串的相等函数eq : string * string -> bool来提供给mkTable。对于后者,您只需使用op=,对于前者,您可以使用相应模块中的HashString.hashString

所以,

val ht : (string, int) HashTable.hash_table = HashTable.mkTable(HashString.hashString, op=)(17, Domain)

应该有用。

但是,我应该注意,哈希表往往被过度使用,而且往往是错误的数据结构。在函数式编程中尤其如此,因为它们是有状态的数据结构。通常使用一些基于树的地图(例如,来自SML / NJ库的RedBlackMapFn)会更好(甚至可能更有效)。

答案 1 :(得分:4)

mkTable值的签名是:

val mkTable : (('a -> word) * (('a * 'a) -> bool)) -> (int * exn)
      -> ('a,'b) hash_table
    (* Given a hashing function and an equality predicate, create a new table;
     * the int is a size hint and the exception is to be raised by find.
     *)

因此,您必须执行以下操作:

val ht : (string, int) HashTable.hash_table =
    HashTable.mkTable (HashString.hashString, op=) (42, Fail "not found")