例えば reverse の後に再び reverse をすると何もしないのと同じなので無意味ですよね。
(無限の配列に対してだと無限ループになりますけどそれはとりあえず置いときます。)
なので、そういう場合には無かったことにするとか、そういう書き換え規則を表現することってできますか?
Common Lisp で言うところのコンパイラマクロみたいなもののことです。
GHC の拡張でそういうのがあったような気がするのですがどうにも詳しいことを重い出せなくて。