微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何满足包含多态集的模块类型

如何解决如何满足包含多态集的模块类型

我正在尝试创建一个公开集合而不公开集合中元素类型的模块。这是一个简化版本:

open Core

module type M_t = sig
  module Id : Comparator.S

  val set : (Id.t,Id.comparator_witness) Set_intf.Tree.t
end

module M : M_t = struct
  module Id = Int
  module S = Set.Make (Id)

  let set = S.empty
end

使用此签名,客户端应用程序可以使用 M_t 签名,并且不知道在幕后,set 包含 int。我的实现不仅不是特别惯用,而且不能编译:

❯ dune build
File "hello_world.ml",lines 9-14,characters 17-3:
 9 | .................struct
10 |   module Id = Int
11 |   module S = Set.Make (Id)
12 | 
13 |   let set = S.empty
14 | end
Error: Signature mismatch:
       ...
       Values do not match:
         val set : S.t
       is not included in
         val set : (int,Id.comparator_witness) Set_intf.Tree.t
       File "hello_world.ml",line 6,characters 2-57: Expected declaration
       File "hello_world.ml",line 13,characters 6-9: Actual declaration

我发现了所有类似的问题,但我没有成功地将答案转移到我的设置中,所以如果这是重复的,我深表歉意。

解决方法

我能想到的解决方案如下:

open Core

module type M_t = sig
  module Id : Comparator.S

  module S : Set.S with type Elt.t = Id.t

  val set : S.t
end

module M : M_t = struct
  module Id = Int
  module S = Set.Make (Id)

  let set = S.empty
end

问题是我找不到强制 Elt.comparator_witness 等于 Id.comparator_witness 的方法,这是我得到的与您最初的问题最接近的工作解决方案(我不是核心用户)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。