我对Ocaml中的Map模块不是很熟悉。
我有一个从m: string Map.Make(Int).t
到int
的简单地图string
,我知道每个绑定(:string
)都是唯一的。我想写一个功能find_from_string_to_int: string -> string Map.Make(Int).t -> int
,有人可以帮忙吗?非常感谢你!
答案 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
可以优化以便在找到值时提前退出迭代,但如果这是一个不常见的操作,那么它无论如何都不重要。