我正在寻找一种工具,在Haskell中给定一个具有多个数据结构的文件,能够生成一个包含数据结构之间关系的图表.
我目前有一个带有解析树的文件(+ - 600行),我想更直观地看到解析树.我有什么选择?
提前致谢.
一种选择是使用diagrams具有各种后端的库.该diagrams-contrib包包括用于渲染树的辅助功能.因此,也许你可以你的解析树转换成玫瑰树从Data.Tree,呈现在这个样子.
以下示例使用SVG后端:
module Treeish where
-- This example requires the containers,
-- diagrams-core, diagrams-lib, diagrams-contrib and diagrams-svg packages
import Data.Tree
import Diagrams.Prelude
import Diagrams.TwoD.Layout.Tree (renderTree,symmLayout',_slHSep,_slVSep)
import Diagrams.Backend.SVG (SVG)
import Diagrams.Backend.SVG.CmdLine (defaultMain)
exampleTree :: Tree String
exampleTree = Node "A" [Node "B" [], Node "C" []]
renderNodeTree :: Tree String -> QDiagram SVG V2 Double Any
renderNodeTree nodeTree = renderTree
(\a -> letter a `atop` square 1.03 # fc white)
(~~)
(symmLayout' (with{ _slHSep = 3, _slVSep = 2}) nodeTree)
where
letter a = text a # font "monospace" # fontSize (local 0.47)
main :: IO ()
main = defaultMain (renderNodeTree exampleTree)
Run Code Online (Sandbox Code Playgroud)
renderTree 是一个函数,给定一个为树节点创建图的函数,以及一个在两个给定点之间创建一条线的函数,返回一个函数,该函数用已经用节点位置注释的树创建一个图.
使用该symmLayout'函数添加位置注释.
with只是default来自的同义词Data.Default.
(~~) 在两点之间创建一条线.
当程序从命令行运行时(类似runhaskell Treeish -o foo.svg -w 300),它将生成一个SVG文件,可以在浏览器中查看:

如果我理解正确的话,您想要获取一些 Haskell 代码的 AST 并将其可视化。首先使用https://hackage.haskell.org/package/haskell-src解析它,然后使用https://hackage.haskell.org/package/graphviz生成输出如何。
如果它不是您想要可视化的 AST,只需将您的数据结构映射到 GraphViz 输出并忽略 Parser.Haskell 部分。
无论如何,我认为滚动自己的可视化代码将是最灵活的方式,并且考虑到 Haskell 的表达能力,可能不会太费力。