Как вы находите и переписываете выражения, которые относятся к одному и тому же связанному имени? Например, в выражении
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, сделав его графиком, но я хотел посмотреть, есть ли какие-либо альтернативы этому подходу.