如何查找和重写引用相同绑定名称的表达式?例如,在表达式
let xs = ...
in ...map f xs...map g xs...
表达式map f xs
和表达式都map g xs
引用相同的绑定名称,即xs
. 是否有任何标准编译器分析可以让我们识别这种情况并将这两个map
表达式重写为例如
let xs = ...
e = unzip (map (f *** g) xs)
in ...fst e...snd e...
我一直在考虑树遍历方面的问题。例如给定 AST:
data Ast = Map (a -> b) -> Ast -> Ast
| Var String
| ...
我们可以尝试编写一个树遍历来检测这种情况,但这似乎很困难,因为Map
引用相同的两个节点Var
可能出现在树的不同位置。如果您反转 AST 中的所有引用,使其成为图表,则此分析似乎更容易完成,但我想看看是否有任何替代方法。