Module ocaml:创建多态类型集

Module ocaml:创建多态类型集,module,ocaml,Module,Ocaml,在一个模块中,我定义了一个表示图节点的类型,它有一个多态数据字段,即 type 'a t = {data: 'a; adj: 'a t list} 我如何才能开始创建一个这样的数据集?我尝试了以下(根据其中一项建议) 但是当我这样做的时候,我得到了“受'with'约束的签名没有名为elt的组件”我不确定您到底想做什么,但是如果您只想创建一组数据类型为int的节点,那么您不需要使用任何比通常的OCaml模块操作更奇特的操作 以下代码适用于我: module Graph = struct

在一个模块中,我定义了一个表示图节点的类型,它有一个多态数据字段,即

type 'a t = {data: 'a; adj: 'a t list}
我如何才能开始创建一个这样的数据集?我尝试了以下(根据其中一项建议)


但是当我这样做的时候,我得到了“受'with'约束的签名没有名为elt的组件”

我不确定您到底想做什么,但是如果您只想创建一组数据类型为
int
的节点,那么您不需要使用任何比通常的OCaml模块操作更奇特的操作

以下代码适用于我:

module Graph =
struct
    type 'a t = {data: 'a; adj: 'a t list}
end

let cmp (g1:int Graph.t) (g2: int Graph.t) : int =
    if g1 == g2 then
        0
    else
        compare g1.Graph.data g2.Graph.data

module GSet = Set.Make(struct type t = int Graph.t let compare = cmp end)
下面是一个带有代码的会话:

$ ocaml
        OCaml version 4.01.0

# #use "g.ml";;
module Graph : sig type 'a t = { data : 'a; adj : 'a t list; } end
val cmp : int Graph.t -> int Graph.t -> int = <fun>
module GSet :
  sig
    type elt = int Graph.t
    . . .
  end
# let myset = GSet.add { Graph.data = 14; adj = [] } GSet.empty;;
val myset : GSet.t = <abstr>
# GSet.is_empty myset;;
- : bool = false
$ocaml
OCaml版本4.01.0
##使用“g.ml”;;
模块图:sig type'AT={data:'a;adj:'a t list;}end
val cmp:int-Graph.t->int-Graph.t->int=
模块GSet:
信号
类型elt=int-Graph.t
. . .
结束
#让myset=GSet.add{Graph.data=14;adj=[]}GSet.empty;;
val myset:GSet.t=
#GSet.is_empty myset;;
-:bool=false

我看不出有什么理由限制模块类型,因为
Set.S
已经是
Set.Make
返回的模块类型。但是我不是OCaml模块类型的老练用户。

该代码在解释器中对我来说运行良好。也许您在没有定义
elt
类型的情况下打开了另一个
Set
模块在
S

如果我在解释器中定义以下
Set

# module Set = struct
      module type S = sig end
  end;;
module Set : sig module type S = sig  end end
然后在编写时简单地重新定义
make_set
,我实际上会收到相同的错误消息。在使用解释器尝试代码时,请始终记住,您可能正在使用以前编写的定义

  • 根据经验,尽量避免将值绑定到您希望使用的库中已经使用的名称上(我知道缩短名称很有诱惑力,但至少要为它们添加一个小的独特前缀-例如,在您的情况下,使用
    ISet
    而不是
    Set

  • 您始终可以将代码作为脚本运行,即通过以下方式从命令行启动代码:

    $ ocaml my_script.ml
    
或者通过解释器提示下的
#use
指令。这允许您在使用新的ocaml环境进行测试之前编写代码片段


最后,正如@Jeffrey提供的答案所示,对于大多数用途来说,一个未打包的模块已经足够好了;您的代码是关于实例化一个一级模块的,只有当您打算在不使用函子的情况下传递该模块时,这才是有趣的。请参阅关于模块的(以及该语言的相关部分)进一步解释。

正是我想要的。事情是这样的。当我这样做时,使用“g.ml”和您一样,这是可行的,但是当我尝试将其编译为我正在编辑的文件的一部分时,我得到了错误:签名不匹配:模块不匹配:sig type t=int-Graph.t val-compare:int-Graph.t->int-Graph.t->int-end不包括在Core.Std.Set.Elt字段
se中xp_of_t'是必需的,但不提供字段
t_of_sexp'是必需的,但不提供命令,代码为2。你知道这是什么吗?我的安装是否已损坏?@user3131124如果这是原始问题的一部分,我建议将其包括在你的问题正文中。也就是说,创建一个新的完整的问:这是否是一个你花了一些时间却无法解决的问题。请注意,
Core.Std.Set
与sock ocaml
Set
库有很大不同:你应该查阅它的文档。就是这样。我不知道Core.Std.Set与Set不同。谢谢!谢谢,这对我也很有用。
$ ocaml my_script.ml