Un'opzione è utilizzare la libreria diagrams
, che ha una varietà di backend. Il pacchetto diagrams-contrib
include funzioni ausiliarie per rendering trees. Quindi forse potresti convertire il tuo albero di analisi in unda Data.Tree
e renderlo in questo modo.
Nel seguente esempio si utilizza il backend 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)
renderTree
è una funzione che, data una funzione che crea un diagramma per un nodo della struttura e una funzione che crea una linea tra due punti dati, ritorna una funzione che crea un diagramma da un albero che è stato annotato con le posizioni del nodo.
Le annotazioni di posizione vengono aggiunte utilizzando la funzione symmLayout'
.
with
è solo un sinonimo di default
da Data.Default
.
(~~)
crea una linea tra due punti.
Quando il programma viene eseguito dalla riga di comando (con qualcosa come runhaskell Treeish -o foo.svg -w 300
) verrà generato un file in formato SVG che può essere visualizzato nel browser:
Here e here sono due parti di un recente esercitazione su diagrams
.
Non so nulla di uno strumento specifico Haskell. Probabilmente finirai per utilizzare qualcosa alimentato da GraphVis. – MathematicalOrchid
Quindi dici che ti interessano solo le dichiarazioni di tipo 'data', non il codice effettivo? – Bergi
@Bergi, infatti, voglio solo vedere le dichiarazioni dei dati. – Schiavini