相关疑难解决方法(0)

Haskell中不含Boilerplate的AST注释?

我一直在使用用Haskell编写的Elm编译器.

我想开始为它实现一些优化,其中一部分涉及遍历AST并向某些节点添加"注释",例如尾调用等.

我知道我可以使用SYB或uniplate进行遍历,但我想知道是否有一种无样板的方法来处理类型.

所以,假设我们的AST有一堆代数类型:

data Expr = PlusExpr Expr Expr ...

data Def = TypeAlias String [String] Type ...
Run Code Online (Sandbox Code Playgroud)

如果我正在编写样板文件,我会创建这样的新类型:

data AnnotatedExpr = PlusExpr Expr Expr [Annotation] ...

data AnnotatedDef = TypeAlias String [String] Type [Annotation] ...
Run Code Online (Sandbox Code Playgroud)

这是很多写的boilderplate,并且似乎是避免这种做法的好习惯.

我可以这样写:

Data AnnotationTree =  Leaf  [Annotation]
     | Internal [AnnotationTree] [Annotation]
Run Code Online (Sandbox Code Playgroud)

然后我就会有一个与AST并行运行的注释树.但是不能保证这些树具有相同的结构,因此我们失去了类型安全性.

所以我想知道,是否有一个优雅/推荐的解决方案,以避免样板,但仍然以类型安全的方式注释树?要用等效的节点替换每个节点,还有稍后将在编译中使用的注释列表?

haskell generic-programming ghc scrap-your-boilerplate template-haskell

27
推荐指数
2
解决办法
1645
查看次数