你需要改变这两行
module Set (Elt:Ordered) : S = module OrdInt : Ordered =
至
module Set (Elt:Ordered) : S with type elt = Elt.t = module OrdInt : Ordered with type t = int =
没有这些,模块将没有将类型elt和t暴露为int的签名.
[编辑]:set.ml没有'with'位,因为有一个sml.mli,它声明了仿函数的签名,它确实有'with'.此外,如果您没有为其明确指定签名,OrdInt不需要'with',如下所示:
module OrdInt =
您还可以通过定义模块来构造集合:
module IntSet = Set (struct type t = int let lt a b = a < b let eq a b = a = b let leq a b = a <= b end)