如果您要求最小键及其对应元素,这很简单:使用DistMap.min_binding_opt,如果您可以在空地图上引发异常,请使用DistMap.min_binding。
如果您要求最小元素及其对应的键,您将需要使用折叠。幸运的是,Map.Make 返回的DistMap 模块公开了一个fold 函数,因此您不必进行额外的分配,例如调用to_seq 并对结果进行折叠。此外,由于地图中元素的类型不受仿函数应用程序的限制(即,您可以创建具有任何元素类型的地图),因此您需要客户端提供元素类型的比较函数。
DistMap.fold 的类型为(key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b,因此我们必须实例化'b,以便同时跟踪 key 和 min 元素;换句话说,我们将'a 实例化为地图的元素类型(我们称之为t),并将'b 实例化为(key * t) option(其中key = position = float * float)。
代码如下所示:
let min_element_and_its_key map ~compare_element =
let take_min key element key_and_min_element =
match key_and_min_element with
| None -> Some (key, element)
| Some (key_for_min_element, min_element) ->
if compare_element element min_element < 0
then Some (key, element)
else Some (key_for_min_element, min_element)
in
DistMap.fold take_min map None
min_element_and_its_key 将在空地图上返回 None。
示例客户端代码(您可以在 ocaml repl 中运行)可能如下所示:
let map = DistMap.(empty |> add (3., 3.) "a" |> add (4., 4.) "b") in
min_element_and_its_key map ~compare_element:String.compare;;
(* Output: *)
- : (node * string) option = Some ((3., 3.), "a")
一般来说,只要你想遍历数据结构中的所有键/元素并累积一个值,fold 就是要走的路。 iter 会起作用,但是您必须在可变状态下累积值,而不是直接将其累积为要折叠的函数的返回值。