Правила перезаписи 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

{-# 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

Почему это? Должен ли я писать правила перезаписи для каждой возможной реализации?

9
задан Toymakerii 12 February 2012 в 23:18
поделиться