Почему haskell требует нескольких правил перезаписи в зависимости от техники и длины композиции? Есть ли способ избежать этого?Правила и функция перезаписи 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. –