如何将列表的元素添加到哈希表?

时间:2019-12-30 23:28:43

标签: list ocaml hashtable

我正在尝试通过使用列表将元素添加到哈希表中。

我的节点类型如下:

type position = float * float
type node = position

我错误地假设并开始编写函数,就好像我可以应用递归构建普通列表的方法一样,但是我不知道现在将递归调用放在哪里。

这是我到目前为止尝试过的:

let init_dist nodes source =
let hshNodes = Hashtbl.create (List.length nodes) + 5 in
let rec init_dist_aux nodes hashtable source =
  match nodes with
  | [] -> hashtable
  | x::tl > if x = source then Hashtbl.add hashtable (x,0.)
            else Hashtbl.add hashtable (x,max_float)

nodes参数是节点列表,source是节点。

我没有错误输出,因为由于它根本无法工作,所以我没有运行它。

我的目标是能够编写一个函数,该函数允许我使用节点列表向我的hashtbl添加绑定。

谢谢。

1 个答案:

答案 0 :(得分:1)

您的方法似乎很好。我没有看到对init_dist_aux的任何递归调用,因此它将在添加第一个元素后停止。另外,由于match的一个分支返回哈希表,而另一个分支返回(()),也会产生类型错误。

添加递归调用应该可以解决这两个问题。

更新

您现在拥有这个:

if x = source then
    Hashtbl.add hashtable (x,0.)
else
    Hashtbl.add hashtable (x,max_float)

您想拥有的是这个

if x = source then
    Hashtbl.add hashtable x 0.
else
    Hashtbl.add hashtable x max_float;
init_dist_aux tl hashtable source

通过此更改,您的init_dist_aux函数已经返回了哈希表。要做到这一点,没有什么特别的事情。

但是请注意,我在任何地方都看不到init_dist_aux的电话。您绝对需要调用它才能使它工作:-)

(作为补充,如果您对init_dist_aux的代码不太了解,则可能需要花更多时间考虑递归。只是一个不起眼的观察。)