2015-05-29 16 views
5

Sto cercando uno strumento che, dato un file con più strutture dati in Haskell, sia in grado di generare un diagramma con le relazioni tra le strutture dati.Diagramma generativo delle strutture dati Haskell

Attualmente ho un file con un albero di analisi (+ - 600 righe) e mi piacerebbe vedere l'albero di analisi più visivamente. Quali sono le mie opzioni?

Grazie in anticipo.

+0

Non so nulla di uno strumento specifico Haskell. Probabilmente finirai per utilizzare qualcosa alimentato da GraphVis. – MathematicalOrchid

+0

Quindi dici che ti interessano solo le dichiarazioni di tipo 'data', non il codice effettivo? – Bergi

+0

@Bergi, infatti, voglio solo vedere le dichiarazioni dei dati. – Schiavini

risposta

4

Se ho capito bene, vuoi prendere l'AST di un codice Haskell e visualizzarlo. Che ne dici di analizzarlo prima usando https://hackage.haskell.org/package/haskell-src e quindi generare output usando https://hackage.haskell.org/package/graphviz.

Se non si tratta di un AST che si desidera visualizzare, è sufficiente mappare la struttura dati in uscita GraphViz e ignorare la parte Parser.Haskell.

In ogni caso, supponevo che la rotazione del proprio codice di visualizzazione sarebbe il modo più flessibile, e dato l'espressività di Haskell, probabilmente non troppo laboriosa.

5

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:

enter image description here

Here e here sono due parti di un recente esercitazione su diagrams.