haskell が関数合成のテクニックと長さに応じて複数の書き換え規則を必要とするのはなぜですか? これを回避する方法はありますか?
たとえば、次のコードがあるとします...
{-# RULES
"f/f" forall a. f ( f a ) = 4*a
#-}
f a = 2 * a
これは
test1 = f ( f 1 )
ただし、ルールを追加する必要があります
test2 = f . f $ 1
と
test3 = f $ f 1
次のルールを残します
{-# RULES
"f/f1" forall a. f ( f a ) = 4 * a
"f/f2" forall a. f . f $ a = 4 * a
"f/f3" forall a. f $ f $ a = 4 * a
#-}
ただし、これらをつなぎ合わせたり、他の形式の構成を使用したりすると、ルールは起動しません。
test4 = f . f . f $ 1
test5 = f $ f $ f $ 1
test6 = f $ 1
どうしてこれなの?考えられる実装ごとに書き換えルールを作成する必要がありますか?