如何使用Haskell';s graphviz包

如何使用Haskell';s graphviz包,haskell,graphviz,Haskell,Graphviz,这个问题并不能解决我面临的问题,但我的问题是基于这个问题的 我试图实现的是使用package绘制一个带有标记节点和未标记边的有向图。在我的例子中,节点的标签类型为String(图的类型定义为Gr String())。下面是代码(其中used graph是的缩小版-我的用例的完美示例): modulemain其中 导入Data.Graph.inclusive.Graph(mkGraph) 导入Data.Graph.inclusive.PatriciaTree(Gr) 导入Data.GraphViz

这个问题并不能解决我面临的问题,但我的问题是基于这个问题的

我试图实现的是使用package绘制一个带有标记节点和未标记边的有向图。在我的例子中,节点的标签类型为
String
(图的类型定义为
Gr String()
)。下面是代码(其中used graph是的缩小版-我的用例的完美示例):

modulemain其中
导入Data.Graph.inclusive.Graph(mkGraph)
导入Data.Graph.inclusive.PatriciaTree(Gr)
导入Data.GraphViz(graphToDot,非聚集参数)
导入Data.GraphViz.Printing(renderDot、toDot)
导入Data.Text.Lazy(解包)
main::IO()
main=do
让我们举个例子,graph=mkGraph(zip[1..3][“短裤”、“袜子”、“手表”])[(1,2,(),(2,3,())]::Gr String()
putStrLn$unpack$renderDot$toDot$graphToDot非聚集参数示例图
它看起来像是
graphviz
haskell包上下文中的“标签”并不意味着我假设的是图的实际标签-结果图的标签变成了它的“内部”索引。此代码的输出为:

digraph {
    1;
    2;
    3;
    1 -> 2;
    2 -> 3;
}
当传递到
dot
时,结果图如下所示:

但我希望实现以下目标:


尝试自定义参数。按照这些思路可能会奏效:

modulemain其中
导入数据。函子(())
将限定的Data.Text.Lazy导入为L(包)
将限定的Data.Text.Lazy.IO导入为IO(putStrLn)
导入Data.Graph.inclusive.Graph(mkGraph)
导入Data.Graph.inclusive.PatriciaTree(Gr)
导入Data.GraphViz(graphToDot、非聚集参数、fmtNode)
导入Data.GraphViz.Attributes.Complete(标签(StrLabel)、属性(标签))
导入Data.GraphViz.Printing(renderDot、toDot)
exampleGraph::Gr字符串()
exampleGraph=mkGraph(zip[1..3][“短裤”、“袜子”、“手表”])[(1,2,(),(2,3,())]
LabelledNodeParams=nonClusteredParams{fmtNode=\(\,label)->[label(StrLabel(L.pack label))]
putGraph::Gr字符串()->IO()
putGraph=图形点标签节点参数toDot renderDot IO.putStrLn
main=putGraph示例图形

谢谢!我让它工作了。我已将您的代码编辑为“可编译”:)您好,您能提供更多关于此工作原理的解释吗?为什么函子是必要的?大括号用于获取记录类型的字段,对吗?然后使用lambda函数将其设置为示例图中的标签?有关于为什么/如何设置这样的点图参数的文档吗?提前感谢..谢谢你的修复,mjarosie.)@Daniel Miederna,函子不是必需的。putGraph可以等效地写入
putGraph graph=IO.putStrLn(renderDot(toDot(graphToDot LabelledNodeParams graph))
。字段fmtGraph是一个函数。我建议通过在Hoogle上查找非集群参数的类型,然后在Hoogle上查找该类型,以查找参数记录类型中字段的文档。这些信息回答了你的问题吗?