Почему 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
Почему это? Должен ли я писать правила перезаписи для каждой возможной реализации?
$
и.
— это просто импортированные функции из Prelude. - person Tikhon Jelvis   schedule 13.02.2012