生成Haskell数据结构图

Sch*_*ini 5 haskell graph

我正在寻找一种工具,在Haskell中给定一个具有多个数据结构的文件,能够生成一个包含数据结构之间关系的图表.

我目前有一个带有解析树的文件(+ - 600行),我想更直观地看到解析树.我有什么选择?

提前致谢.

dan*_*iaz 5

一种选择是使用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文件,可以在浏览器中查看:

在此输入图像描述

这里这里是最近的教程的两个部分diagrams.


Eri*_*lun 4

如果我理解正确的话,您想要获取一些 Haskell 代码的 AST 并将其可视化。首先使用https://hackage.haskell.org/package/haskell-src解析它,然后使用https://hackage.haskell.org/package/graphviz生成输出如何。

如果它不是您想要可视化的 AST,只需将您的数据结构映射到 GraphViz 输出并忽略 Parser.Haskell 部分。

无论如何,我认为滚动自己的可视化代码将是最灵活的方式,并且考虑到 Haskell 的表达能力,可能不会太费力。