Почему 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
{-# 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
Почему это? Должен ли я писать правила перезаписи для каждой возможной реализации?