Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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
用列表和集合在haskell中创建有向无环图_Haskell_Graph_Directed Acyclic Graphs - Fatal编程技术网

用列表和集合在haskell中创建有向无环图

用列表和集合在haskell中创建有向无环图,haskell,graph,directed-acyclic-graphs,Haskell,Graph,Directed Acyclic Graphs,我想在haskell中创建一个DAG,但由于我对函数式编程一无所知,我想了解一些方向 图形只需要使用列表和集合构建,并且必须实现以下功能: v=添加顶点(g,w) 将具有指定权重w的顶点添加到DAG g,并返回其唯一顶点标识符v 添加边(g、a、b、w) 从具有顶点标识符a的顶点到具有顶点标识符b的顶点的边将添加到具有权重w的DAG g 到目前为止,我所做的是创建一个如下所示的数据类型: data Graph v w = Graph {vertices :: [(v, w)], edges ::

我想在haskell中创建一个DAG,但由于我对函数式编程一无所知,我想了解一些方向

图形只需要使用列表和集合构建,并且必须实现以下功能:

v=添加顶点(g,w)

将具有指定权重w的顶点添加到DAG g,并返回其唯一顶点标识符v

添加边(g、a、b、w)

从具有顶点标识符a的顶点到具有顶点标识符b的顶点的边将添加到具有权重w的DAG g

到目前为止,我所做的是创建一个如下所示的数据类型:

data Graph v w = Graph {vertices :: [(v, w)],
edges :: [([(v, w)], [(v, w)], w)]} deriving Show
create_graph :: (v,w) -> w -> Graph v w 
create_graph v w  = Graph [v] [(v, v, w)]
我想我需要某种形式的构造器,它看起来像这样:

data Graph v w = Graph {vertices :: [(v, w)],
edges :: [([(v, w)], [(v, w)], w)]} deriving Show
create_graph :: (v,w) -> w -> Graph v w 
create_graph v w  = Graph [v] [(v, v, w)]
我想做的是只创建一个空图,但如果理解正确,现在我需要输入一些起始值。我怎样才能解决这个问题

“添加顶点”函数如下所示:

add_vertex :: Graph v w -> (v, w) -> Graph v w
add_vertex (Graph v w) x = Graph (v ++ [x]) w
但是我真的不知道如何返回顶点标识符而不是整个图。我想我还应该指定标识符必须是一个字符,并且权重可以是float或int,我在哪里可以这样做

我还想要一些函数,用于拓扑排序和获取最长路径的权重。考虑到这一点,我应该以不同的方式定义图的结构吗


谢谢

我要做的就是像树一样定义图形

data Graph a = Graph [(a,[a])] -- Graph is a list of origins paired with edgeends

createGraph ::Eq a => [(a,a)] -> Graph a
createGraph = undefined

empty :: Graph a
empty = Graph []

insertVertex :: Eq a => a -> Graph a -> Graph a
insertVertex = undefined -- insert if not already in the Graph (with empty edges)

insertEdge :: Eq a => (a,a) -> Graph a -> Graph a
insertEdge = undefined -- insert edge in list of origin
--do not forget to add origin, end if they don't exist

实施这些,稍后再考虑bfs/topsort,并考虑bfs的结果-您希望结果如何?(我想topsort的结果应该是一个列表)。

1)图形数据类型只存储顶点,但“图形构造函数”也尝试存储边。2) 您的添加顶点实现非常统一。这里应该使用:而不是+。也许你应该从简单的练习开始。是的,这就是构造器的问题。我只想做一个空图,不插入任何顶点或边,这可行吗?将研究从++到:,感谢您指出这一点。这是我们在学校得到的第一个例外,我正在尽可能多地阅读“向你学习haskell”。空图应该是
emptyGraph=graph[][]
。在您的数据类型中,我不理解为什么每条边都有两个顶点列表;假设
w
是权重的类型参数,为什么顶点的权重在边上重复。哦,我明白了,仍然习惯haskell语法。。。当然,不应该有顶点列表。我将更改它,使边由两个顶点标识符和一个边权重组成,稍后我将使用顶点及其权重将这些标识符映射到列表中。谢谢你的帮助!