使用核心库在ocaml中定义地图类型

时间:2014-02-14 15:09:18

标签: ocaml ocaml-core

OCaml语言的核心库带有非常有用的Map和Table模块。 如果我想使用某种内置类型的地图,我知道如何定义自己的类型:

type mytype = int String.Map.t (* A mapping from strings to integers *)

我也知道如何使用多态比较来定义自定义地图:

type mytype = (string, string) Map.Poly.t (* A map from strings to strings *)

我不知道如何使用从我自己的类型到我自己的类型的非多态比较来定义自定义地图。 例如。假设我有

type row_t = Row of int
type column_t = Column of int
(* I want a map from rows to columns *)
type mymap_t = (row_t, column_t, ???) Map.t

我理解第三个参数应该是比较器,但我不知道要放入什么内容:Int.comparatorInt.comparator_witness都无法提供所需的结果。

1 个答案:

答案 0 :(得分:1)

你可以参考Ashish提到的博客文章。

但是,在使用Core时,我通常更喜欢使用更多“自动”方式为自定义结构生成地图和集合(感谢Core语法扩展)。

这是一个小例子:

module T = struct
  type t = Row of int
  with sexp, compare
end
include T
include Comparable.Make(T)

因此,这将生成您通常需要的所有比较函数(和其他有用的函数)和基本数据结构:

type t = T.t = Row of int
...
val (>) : T.t -> T.t -> bool = <fun>    (* compare functions *)
val (<) : T.t -> T.t -> bool = <fun>
val equal : T.t -> T.t -> bool = <fun>
val compare : T.t -> T.t -> int = <fun>
val min : T.t -> T.t -> T.t = <fun>
val max : T.t -> T.t -> T.t = <fun>
...
module Map :  (* non-polymorphic Map module *)
...
end
module Set :  (* non-polymorphic Set module *)
...
end

还有更多。所以基本上你可以在之后使用非多态地图:

type column_t = Column of int
let map = Map.singleton (Row 1) (Column 2)