用列表和集合在haskell中创建有向无环图
我想在haskell中创建一个DAG,但由于我对函数式编程一无所知,我想了解一些方向 图形只需要使用列表和集合构建,并且必须实现以下功能: v=添加顶点(g,w) 将具有指定权重w的顶点添加到DAG g,并返回其唯一顶点标识符v 添加边(g、a、b、w) 从具有顶点标识符a的顶点到具有顶点标识符b的顶点的边将添加到具有权重w的DAG g 到目前为止,我所做的是创建一个如下所示的数据类型:用列表和集合在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 ::
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语法。。。当然,不应该有顶点列表。我将更改它,使边由两个顶点标识符和一个边权重组成,稍后我将使用顶点及其权重将这些标识符映射到列表中。谢谢你的帮助!