Graph 如何在OCaml中使用边列表表示图形数据结构?

Graph 如何在OCaml中使用边列表表示图形数据结构?,graph,ocaml,Graph,Ocaml,我试图用不相交的并集和记录来表示一个图。以下代码导致语法错误。当两个变量相互引用时,如何定义它们 type 'a vertex = |Empty |Vertex of 'a * 'a list;; (*a tuple consisting of any type of element and a list of vertex*); let v0 = Vertex(0,[v1]) in let v1=Vertex(1,[v0]);; 如果我将中的代码修改为: let rec v0 =

我试图用不相交的并集和记录来表示一个图。以下代码导致语法错误。当两个变量相互引用时,如何定义它们

type 'a vertex = 
  |Empty
  |Vertex of 'a * 'a list;; (*a tuple consisting of any type of element and a list of vertex*);

let v0 = Vertex(0,[v1]) in
let v1=Vertex(1,[v0]);;
如果我将中的代码修改为:

let rec v0 = Vertex(0,[v1]) and  v1=Vertex(1,[v0]);;
我将得到v0:

[Vertex (1,
  [Vertex (0,
    [Vertex (1,
      [Vertex (0,
        [Vertex (1,
          [Vertex (0,
            [Vertex (1,
              [Vertex (0,
                [Vertex (1,
                  [Vertex (0,
                    [Vertex (1,
                      [Vertex (0,
                        [Vertex (1,
                          [Vertex (0,
                            [Vertex (1,
                              [Vertex (0,
                                [Vertex (1,
                                  [Vertex (0,
                                    [Vertex (1,
                                      [Vertex (0,
                                        [Vertex (1,
                                          [Vertex (0,
                                            [Vertex (1,
                                              [Vertex (0,
                                                [Vertex (1,
                                                  [Vertex (0,
                                                    [Vertex (1,
                                                      [Vertex (0,
                                                        [Vertex (1,
                                                          [Vertex (0,
                                                            [Vertex (1,
                                                              [Vertex (0,
                                                                [Vertex (1,
                                                                  [Vertex (0,
                                                                    [Vertex
                                                                    (1,
                                                                    [Vertex
                                                                    (0,
                                                                    [Vertex
                                                                    (1,
                                                                    [Vertex
                                                                    (0,
                                                                    [Vertex
                                                                    (1,
                                                                    [Vertex
                                                                    (0,
                                                                    [Vertex
                                                                    (1,
                                                                    [Vertex
                                                                    (0,
                                                                    [Vertex
                                                                    (1,
                                                                    [Vertex
                                                                    (0,
                                                                    [Vertex
                                                                    (1,
                                                                    [Vertex
                                                                    (0,
                                                                    [Vertex
                                                                    (1,
                                                                    [Vertex
                                                                    (0,
                                                                    [Vertex
                                                                    (1,
                                                                    [Vertex
                                                                    (0,
                                                                    [...])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])]
这似乎不是我想要的

定义包含顶点列表或数组的图形记录的最佳方法是什么?显然,我不能这样做:

type graph = {
    vertex_set:array};;
我得到以下信息:

Error: The type constructor array expects 1 argument(s),
       but is here applied to 0 argument(s)

类型定义中有错误。我很确定你想要的是:

type 'a vertex = 
  |Empty
  |Vertex of 'a * 'a vertex list
您可以使用
let rec
定义此类型的值:

let rec v0 = Vertex(0, [v1]) and v1 = Vertex(1, [v0])
根据我的经验,很难处理这种价值观。OCaml是一种急切的语言,因此很难使用循环值进行计算

对于第二个问题,编译器试图告诉您,
array
本身不是类型。你需要说它是一个数组

如果需要顶点列表而不是数组(可能是个好主意),它将如下所示:

type 'a vertices = {
    vertex_set: 'a vertex list;
}
在我看来,你有两个问题。首先,您需要学习如何在OCaml中指定类型和值。这并不难,你可以在这里得到很好的建议。其次,您需要决定使用什么数据结构来表示图形。这是比较困难的,而且没有最好的方法。您可能不希望使用本身就是图形的数据结构(如上所述)。更现实的可能性是:一个邻接矩阵,或一个顶点集合及其输出边列表。为了避免创建循环结构,您可以只引用顶点,而不是将它们直接包含在边列表中。例如,如果顶点位于数组中,则可以通过数组索引引用它们


有一个名为的图书馆,它可能是我能想到的最好的思想来源

您的类型定义中有错误。我很确定你想要的是:

type 'a vertex = 
  |Empty
  |Vertex of 'a * 'a vertex list
您可以使用
let rec
定义此类型的值:

let rec v0 = Vertex(0, [v1]) and v1 = Vertex(1, [v0])
根据我的经验,很难处理这种价值观。OCaml是一种急切的语言,因此很难使用循环值进行计算

对于第二个问题,编译器试图告诉您,
array
本身不是类型。你需要说它是一个数组

如果需要顶点列表而不是数组(可能是个好主意),它将如下所示:

type 'a vertices = {
    vertex_set: 'a vertex list;
}
在我看来,你有两个问题。首先,您需要学习如何在OCaml中指定类型和值。这并不难,你可以在这里得到很好的建议。其次,您需要决定使用什么数据结构来表示图形。这是比较困难的,而且没有最好的方法。您可能不希望使用本身就是图形的数据结构(如上所述)。更现实的可能性是:一个邻接矩阵,或一个顶点集合及其输出边列表。为了避免创建循环结构,您可以只引用顶点,而不是将它们直接包含在边列表中。例如,如果顶点位于数组中,则可以通过数组索引引用它们


有一个名为的图书馆,它可能是我能想到的最好的思想来源

谢谢。您对在ocaml中处理图形数据结构有什么建议吗?有好的读物吗?ocaml记录能否具有特定类型的列表项?非常感谢!!!定义一个包含顶点列表的记录怎么样?怎么做?我用一个集合和一个地图来表示我们的树和图。用于定义边的集合,以及节点到包含所有邻居的结构的映射。否则很难查找邻居进行遍历。当然,这取决于你的需要。我们必须在分支上进行遍历和优化权重,所以这两种结构都很方便。谢谢。您对在ocaml中处理图形数据结构有什么建议吗?有好的读物吗?ocaml记录能否具有特定类型的列表项?非常感谢!!!定义一个包含顶点列表的记录怎么样?怎么做?我用一个集合和一个地图来表示我们的树和图。用于定义边的集合,以及节点到包含所有邻居的结构的映射。否则很难查找邻居进行遍历。当然,这取决于你的需要。我们必须在分支上进行遍历和优化权重,所以这两种结构都很方便。您所创造的价值正是您所要求的。循环结构有一个无限的打印表示,所以打印出来时看起来很奇怪。OCaml在某种嵌套级别后截断输出,以避免实际写出无限字符串。您创建的值正是您所要求的。循环结构有一个无限的打印表示,所以打印出来时看起来很奇怪。OCaml在某种嵌套级别后截断输出,以避免实际写出无限字符串。