Ocaml,在给定绑定的地图中轻松找到关键字的方法

时间:2011-07-03 14:49:24

标签: map ocaml

我对Ocaml中的Map模块不是很熟悉。

我有一个从m: string Map.Make(Int).tint的简单地图string,我知道每个绑定(:string)都是唯一的。我想写一个功能find_from_string_to_int: string -> string Map.Make(Int).t -> int,有人可以帮忙吗?非常感谢你!

1 个答案:

答案 0 :(得分:3)

如果这是一个不经常的操作,最简单的方法是折叠地图SMap.fold的所有(键,值)绑定:

# module SMap = Map.Make(String);;
# let reverse v t =
  SMap.fold (fun k v' acc -> if v = v' then Some k else acc) t None;;
val reverse : 'a -> 'a SMap.t -> SMap.key option = <fun>

如果这是一项常见的操作,那么您要寻找的是双向地图(可以在两个“方向”中查询的地图)。最简单的方法是携带一对地图:int IMap.t * string SMap.t(两个方向的访问都是对数,而上面的reverse是地图大小的线性)。您还可以实现专用数据结构,但这可能不值得增加复杂性。

PS:reverse可以优化以便在找到值时提前退出迭代,但如果这是一个不常见的操作,那么它无论如何都不重要。