途中送信御免

例えば、
(("hoge") "hage" (("fuga") "hage" ("fuga")))
という木なら
((0) 1 ((2) 1 (2)))
にする。

手続き型言語なら、実行した置換を記録しながら木を左から走査していけば良いわけだが、
Stateモナドを使えばHaskellでも同様に書ける。逆にStateモナドを使わずに写像を引き回すのは面倒。