Ho giocato con il compilatore Elm, che è scritto in Haskell.Annotazione Boilerplate di AST in Haskell?
mi piacerebbe iniziare ad attuare alcune ottimizzazioni per esso, e parte di questo comporta che attraversa l'AST e l'aggiunta di "annotazione" di alcuni nodi, come ad esempio coda le chiamate, ecc
So che posso usare SYB o uniplate per fare il traversal, ma mi chiedo se c'è un modo senza accordi per affrontare i tipi.
Così, supponiamo di avere un sacco di tipi algebrici per la nostra AST:
data Expr = PlusExpr Expr Expr ...
data Def = TypeAlias String [String] Type ...
Se dovessi scrivere il testo standard, mi piacerebbe fare nuove tipologie come questo:
data AnnotatedExpr = PlusExpr Expr Expr [Annotation] ...
data AnnotatedDef = TypeAlias String [String] Type [Annotation] ...
Questo è un sacco di boilderplate da scrivere, e sembra una buona pratica evitare questo.
potrei scrivere qualcosa di simile:
Data AnnotationTree = Leaf [Annotation]
| Internal [AnnotationTree] [Annotation]
Poi avevo appena hanno un albero di annotazione che corre parallela alla AST. Ma non vi è alcuna garanzia che questi alberi abbiano la stessa struttura, quindi perdiamo la sicurezza del tipo.
Quindi mi chiedo, c'è una soluzione elegante/consigliata per evitare lo standard di stampa, ma annotare ancora un albero in un modo sicuro? Per sostituire ciascun nodo con uno equivalente, oltre a un elenco di annotazioni che verranno utilizzate in seguito nella compilazione?
Come questo approccio si generalizza a situazioni in cui invece di un singolo tipo 'Expr', abbiamo un gruppo di tipi mutuamente induttivi, ad es. Supponiamo che 'Espr' abbia un costrutto' case' che contiene 'Pat's, ma alcuni di questi possono essere schemi di visualizzazione che contengono un' Expr'? – Cactus
È possibile ridimensionarlo un po 'più avanti con qualcosa come 'dati Weave f g = Weave (g (Weave g f) (Weave f g))', https://gist.github.com/tel/29eb767c7cb331104537. In generale, penso che avresti bisogno di iniziare a studiare il lavoro in * Initial Algebra Semantics è sufficiente! *, Ma non lo capisco ancora. –
Sfortunatamente, questo approccio non sembra funzionare durante l'annotazione. La bialgebra 'f a a -> a' è troppo restrittiva per costruire' Weave's dai ricursori di 'Weave'. –