Powiedzmy mam prosty typ danych reprezentujący AST w jakimś języku: (. W rzeczywistości byłoby oczywiście mieć więcej konstruktorów niż to)Jak powinienem reprezentować AST opatrzony dodatkowymi informacjami?
data Term = Var String
| Num Integer
| Expr [Term]
mogę to wykorzystać, aby napisać prostą ocenę funkcja pasująca do struktury AST:
eval :: Term -> Result
eval (Var name) = lookup name
eval (Num n) = return n
eval (Expr exprs) = ...
Czy mogę opatrzyć przypisami AST informacje takie jak numery linii bez zmiany sposobu dopasowywania wzorców?
(Jeśli nie przeszkadza zmianę wzorców, mogę używać rekordowe składniowe lub zobacz wzory, oczywiście.)
Co z kontenerem ADT takim jak 'dane AtLine a = AtLine Int a'? –
@NikitaVolkov: To jest dokładnie to, co zrobiłbym z czymś takim jak ViewPatterns. Zastanawiam się tylko, czy istnieje dobry sposób na uniknięcie zmiany dopasowywania wzorca w ogóle. –
Dlaczego miałoby to wpływ na dopasowywanie wzorców, jeśli jest to typ "Term", który pasuje? –