同じバインドされた名前を参照する式をどのように見つけて書き換えますか? たとえば、式では
let xs = ...
in ...map f xs...map g xs...
map f xs
式と 式 の両方がmap g xs
同じバインドされた名前、つまり を参照していますxs
。map
この状況を特定し、2 つの式を次のように書き換えることができる標準的なコンパイラ分析はありますか。
let xs = ...
e = unzip (map (f *** g) xs)
in ...fst e...snd e...
私はツリートラバーサルの観点から問題について考えてきました。たとえば、AST が与えられた場合:
data Ast = Map (a -> b) -> Ast -> Ast
| Var String
| ...
このケースを検出するためにツリー トラバーサルを記述しようとすることもできますがMap
、同じものを参照する 2 つのノードがVar
ツリー内の大きく異なる場所に現れる可能性があるため、それは難しいようです。この分析は、AST 内のすべての参照を逆にしてグラフにした方が簡単に思えますが、その方法に代わる方法がないかどうかを確認したかったのです。