我一直在尝试使用Haskell编写的Elm编译器。
我想开始实现一些优化,其中一部分涉及遍历AST并向某些节点添加“注释”,例如尾调用等。
我知道可以使用SYB或uniplate来进行遍历,但我想知道是否有一种无需样板代码的处理类型的方法。
因此,假设我们有一堆代数类型用于表示我们的AST:
data Expr = PlusExpr Expr Expr ...
data Def = TypeAlias String [String] Type ...
如果我在写模板文件,我会像这样创建新的类型:
data AnnotatedExpr = PlusExpr Expr Expr [Annotation] ...
data AnnotatedDef = TypeAlias String [String] Type [Annotation] ...
写这么多样板代码很繁琐,避免这种情况似乎是个不错的实践。
我可以这样写:
Data AnnotationTree = Leaf [Annotation]
| Internal [AnnotationTree] [Annotation]
那么我将只需要一个与 AST 并行的注释树。但是,这些树没有保证具有相同的结构,因此我们会失去类型安全性。
所以我在思考,是否有一种优雅/推荐的解决方案,既避免样板代码,又以类型安全的方式注释树?是否可以用等效节点及其后编译中使用的注释列表替换每个节点?
data Weave f g = Weave (g (Weave g f) (Weave f g))
这样的方式进一步扩展它,https://gist.github.com/tel/29eb767c7cb331104537。通常,我认为你需要开始研究《初始代数语义就足够了!》中的工作,但我还不理解那个。 - J. Abrahamsonf a a -> a
过于严格,无法从Weave
递归器构建Weave
。 - J. Abrahamson