为什么 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
为什么是这样?我是否必须为每个可能的实现编写重写规则?