Ответ 1
Я думаю, что вы ищете набор программных преобразований, обычно называемых Tupling, Fusion и Supercompilation, которые подпадают под более общую теорию преобразования Unfold/Fold. Вы можете достичь того, чего хотите, следующим образом.
Сначала выполните спекулятивные оценки (разворачивание) путем "управления" определением карты по аргументам, что порождает две новые псевдопрограммы, в зависимости от того, имеет ли xs форму y: ys или []. В псевдокоде:
let y:ys = ...
in ...(f y):(map f ys)...(g y):(map g ys)...
let [] = ...
in ...[]...[]...
Затем выполните абстракции для общей структуры (Tupling) и обобщений (Folding) относительно исходной программы, чтобы иначе остановить вечное разворачивание:
let xs = ...
in ...(fst tuple)...(snd tuple)...
where tuple = generalisation xs
generalisation [] = ([],[])
generalisation (y:ys) = let tuple = generalisation ys
in ((f y):(fst tuple),(g y):(snd tuple))
Надеюсь, это дает вам представление, но программа tranformation - это поле исследований в своем собственном праве, и ее трудно объяснить, не рисуя ациклические ориентированные графики.