Comment trouvez-vous et réécrivez-vous des expressions qui font référence au même nom lié? Par exemple, dans l'expressionComment créer une passe de réécriture selon que deux expressions se rapportent au même nom lié?
let xs = ...
in ...map f xs...map g xs...
à la fois l'expression et l'expression map f xs
map g xs
se référer au même nom lié, à savoir xs
. Existe-t-il des analyses de compilateur standard qui nous permettraient d'identifier cette situation et de réécrire les deux expressions map
par exemple.
let xs = ...
e = unzip (map (f *** g) xs)
in ...fst e...snd e...
Je pensais au problème en termes de traversée d'arbre. Par exemple donné l'AST:
data Ast = Map (a -> b) -> Ast -> Ast
| Var String
| ...
nous pourrions essayer d'écrire un traversal d'arbre pour détecter ce cas, mais cela semble difficile, car deux Map
noeuds qui se réfèrent à la même Var
peuvent apparaître à des endroits très différents dans l'arborescence. Cette analyse semble plus facile à faire si vous avez inversé toutes les références dans l'AST, ce qui en fait un graphique, mais je voulais voir s'il y avait des alternatives à cette approche.