Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 代表一个;图;就像一份继任者名单_Functional Programming_Ocaml - Fatal编程技术网

Functional programming 代表一个;图;就像一份继任者名单

Functional programming 代表一个;图;就像一份继任者名单,functional-programming,ocaml,Functional Programming,Ocaml,我有一个列表,它表示一个Ipotetic图中节点(边)之间的连接;列表的结构如下所示: val def_graph : ((int * int) * (int * int)) list = [((0, 0), (2, 1)); ((0, 0), (1, 2)); ((0, 1), (2, 0)); ((0, 1), (2, 2)); ((0, 1), (1, 3)); ((0, 2), (2, 1)); ((0, 2), (2, 3)); ((0, 2), (1, 0)); ((0, 2), (

我有一个列表,它表示一个Ipotetic图中节点(边)之间的连接;列表的结构如下所示:

val def_graph : ((int * int) * (int * int)) list =
[((0, 0), (2, 1)); ((0, 0), (1, 2)); ((0, 1), (2, 0)); ((0, 1), (2, 2));
((0, 1), (1, 3)); ((0, 2), (2, 1)); ((0, 2), (2, 3)); ((0, 2), (1, 0));
((0, 2), (1, 4)); ((0, 3), (2, 2)); ((0, 3), (2, 4)); ((0, 3), (1, 1));
((0, 3), (1, 5)); ((0, 4), (2, 3)); ((0, 4), (2, 5)); ((0, 4), (1, 2));
((0, 4), (1, 6)); ((0, 5), (2, 4)); ((0, 5), (2, 6)); ((0, 5), (1, 3));
((0, 5), (1, 7)); ((0, 6), (2, 5)); ((0, 6), (2, 7)); ((0, 6), (1, 4));
((0, 7), (2, 6)); ((0, 7), (1, 5)); ((1, 0), (3, 1)); ((1, 0), (0, 2));
((1, 0), (2, 2)); ((1, 1), (3, 0)); ((1, 1), (3, 2)); ((1, 1), (0, 3));
((1, 1), (2, 3)); ((1, 2), (3, 1)); ((1, 2), (3, 3)); ((1, 2), (0, 0));
((1, 2), (0, 4)); ((1, 2), (2, 0)); ((1, 2), (2, 4)); ((1, 3), (3, 2));
((1, 3), (3, 4)); ((1, 3), (0, 1)); ((1, 3), (...)); ...]
其中节点由元组表示((0,0)是一个节点,(1,3)是一个节点等等…)并且((0,0),(2,1))表示节点(0,0)和节点(2,1)之间的连接

如何通过任何节点的后续节点列表来表示我的“图”? 结果必须是:

val succ_graph : ((int * int) * (int * int) list) list =
[((0,0),[(2,1),(1,2)]);((0,1),[(2,0),(2,2),(1,3)]);((0,2),[(2,1),(2,3),
(1,0),(1,4)]); .... ]
元组列表,其中第一个参数是节点本身,第二个参数是其任何后续节点的列表

我编写了一个函数,用于提取给定特定节点的后续节点列表,但我不知道如何执行其余操作

let succ arcs node =
  let rec aux = function
    [] -> []
    | (x,y)::rest -> if x = node then y::aux rest
       else aux rest
  in aux arcs;;
很抱歉,这是我第一次使用ocaml,很抱歉英语不好


谢谢。

作为初步评论,您的问题陈述和示例有点令人困惑。您给出的示例结果不是您所希望的类型。你的函数也不会计算类型的一部分。假设您确实想要这种类型:

((int * int) * ((int * int) * (int * int)) list) list
对于图形的每个节点,都需要一个节点对列表。这方面的一个例子是:

[((0, 0), [((0, 0), (2, 1)); ((0, 0), (1, 2))]); ... ]
您的示例结果与此不同,您的函数正在计算节点列表(而不是节点对列表)

因此,首先要做的可能是解决这一分歧

在你弄明白这一点之后,你现在的代码实际上非常接近正确答案。您可以将看到的每个链接添加到答案中,而不是从特定节点查找链接。不要把答案放在列表的前面,你需要能够在你正在构建的结果中插入答案

因此,一个很好的起点可能是编写代码,将新链接添加到
((int*int)*((int*int)*(int*int))list
类型的累积结果

OCaml中的列表是不可变的,因此实现这一点的方法是构造一个新的列表。新的清单将包含旧清单的许多部分;你不必从头开始构建它。(事实上,这就是不可变数据在实践中实际可用的原因。)

更新

正如我所说,如果您编写的函数在正确的位置添加了新的后继函数,则可以使用当前代码。然后使用这个新函数,而不是现在使用的简单函数

但“添加”到不可变结构的概念一开始有点棘手

下面是一个函数,它在保持列表排序的同时将int“添加”到列表中。即,它返回一个具有所需属性的新列表。旧列表不变(不可变,这是给定的)

您可以使用此插入函数对列表进行排序(效率低下):

看起来是这样的:

# insert [1; 1; 3; 4; 5; 9] 2;;
- : int list = [1; 1; 2; 3; 4; 5; 9]
# sort [3; 1; 4; 1; 5; 9; 2];;
- : int list = [1; 1; 2; 3; 4; 5; 9]

这基本上就是你想要做的,除了你有对而不是整数,而且你的结构比排序列表要复杂一些。

你是对的……事实上,我写这个例子是错的。。。。实际上,我想要一个这样的结果((int*int)*(int*int)list)list,它表示这种结果[(0,0),[(2,1),(1,2)];(0,1),[(2,0),(2,2),(1,3)];((0,2),[(2,1),(2,3),(1,0),(1,4)];…]。对于每个节点,我需要一个元组列表,第一个元素包含节点本身,第二个参数包含其后续元素的列表。我希望我现在能更好地解释自己!
let rec sort = function
| [] -> []
| h :: t -> insert (sort t) h
# sort [3; 1; 4; 1; 5; 9; 2];;
- : int list = [1; 1; 2; 3; 4; 5; 9]