Jak znaleźć i ponownie napisać wyrażenia odnoszące się do tej samej nazwy powiązanej? Na przykład, w wyrażeniuJak utworzyć przejście przepisać na podstawie tego, czy dwa wyrażenia odwołują się do tej samej nazwy powiązanej?
let xs = ...
in ...map f xs...map g xs...
zarówno wyrażenie map f xs
i wyrażenie map g xs
odnoszą się do tej samej nazwy związane, mianowicie xs
. Czy istnieją jakieś standardowe analizy kompilatorów, które pozwolą nam zidentyfikować tę sytuację i przepisać oba wyrażenia o wartości map
na przykład?
let xs = ...
e = unzip (map (f *** g) xs)
in ...fst e...snd e...
Myślałem o problemie w kategoriach przemiany drzewa. Na przykład biorąc pod uwagę AST:
data Ast = Map (a -> b) -> Ast -> Ast
| Var String
| ...
moglibyśmy spróbować napisać przechodzenie drzewa w celu wykrycia tej sprawy, ale to wydaje się trudne, ponieważ dwa Map
węzły, które odnoszą się do tego samego Var
może pojawić się w bardzo różnych miejscach na drzewie. Ta analiza wydaje się łatwiejsza, jeśli odwrócisz wszystkie odniesienia w AST, tworząc wykres, ale chciałem sprawdzić, czy istnieją jakieś alternatywy dla tego podejścia.