¿Cómo se encuentran y reescriben las expresiones que hacen referencia al mismo nombre encuadernado? Por ejemplo, en la expresión¿Cómo se crea un pase de reescritura basado en si dos expresiones se refieren al mismo nombre encuadernado?
let xs = ...
in ...map f xs...map g xs...
tanto la expresión map f xs
y la expresión map g xs
referirse al mismo nombre unido, a saber xs
. ¿Hay algún análisis de compilación estándar que nos permita identificar esta situación y reescribir las dos expresiones map
a, p.
let xs = ...
e = unzip (map (f *** g) xs)
in ...fst e...snd e...
He estado pensando en el problema en términos de un cruce de árboles. Por ejemplo, dada la AST:
data Ast = Map (a -> b) -> Ast -> Ast
| Var String
| ...
podríamos tratar de escribir un recorrido de árbol para detectar este caso, pero que parece difícil, ya que dos Map
nodos que se refieren a la misma Var
podrían aparecer en muy diferentes lugares en el árbol. Este análisis parece más fácil de hacer si invertiste todas las referencias en el AST, convirtiéndolo en un gráfico, pero quería ver si hay alguna alternativa a ese enfoque.