据我所知,我不认为这会使id1和id2来自类型类并且id1'和id2'不是。我正在使用最新的Haskell平台(GHC版本7.0.4和现在的7.4.1)运行“ghc Rewrite”,我也希望1也能够发射。重写规则不会触发匹配多个实例方法的规则
$ ghc Rewrite
[1 of 1] Compiling RewriteProblems (Rewrite.hs, Rewrite.o)
Rule fired: rewrite/ez'
Rule fired: rewrite/to1'
Rule fired: rewrite/ez
Rule fired: rewrite/ez
Rule fired: Class op id2
Rule fired: Class op id2
的例子:
{-# OPTIONS_GHC -O -ddump-rule-firings #-}
module RewriteProblems where
{-# RULES
"rewrite/ez" forall a. id1 a = RDUnit
"rewrite/to1" forall a. id2 (id2 a) = id1 a
"rewrite/ez'" forall a. id1' a = RDUnit
"rewrite/to1'" forall a. id2' (id2' a) = id1 a
#-}
class Ider a where
id1 :: a -> a
id2 :: a -> a
data RewriteD = RDUnit
instance Ider RewriteD where
{-# INLINE[1] id1 #-}
{-# INLINE[1] id2 #-}
id1 a = RDUnit
id2 a = RDUnit
testThing1 :: RewriteD
testThing1 = id1 RDUnit
testThing2 :: RewriteD
testThing2 = id2 (id2 RDUnit)
testThing1' :: RewriteD
testThing1' = id1' RDUnit
testThing2' :: RewriteD
testThing2' = id2' (id2' RDUnit)
{-# INLINE[1] id1' #-}
{-# INLINE[1] id2' #-}
id1' :: RewriteD -> RewriteD
id2' :: RewriteD -> RewriteD
id1' a = RDUnit
id2' a = RDUnit
我刚刚安装了GHC的最新版本 - 版本7.4.1,现在我得到了和以前一样的输出。另外,是的,我意识到这些规则对输出没有任何影响 - 我只是通过这个测试用例来隔离我在一个更复杂的示例中遇到的问题。另外,我相信优先权在这里实际上是正常工作的......只是看着输出结果确实显示我的所有规则都是在这些出现之前尝试的。 – Akh 2012-03-22 04:18:41
你究竟如何确定你的规则是企图?我知道无法让GHC显示未应用的规则,或者在多个匹配的情况下使用哪个规则。你可以做的最好的是检查什么是真正被解雇的,在这种情况下是类操作规则。 – 2012-03-22 13:07:37
如果更改程序以使实例方法返回类似于错误的东西,即与RDUnit不同的东西,则重写规则应该让您处理,优化程序会在“testThing2”示例中为您留下错误值。我认为这个示例程序只是有点过分,不能清楚地显示问题。 – Anthony 2012-03-22 15:37:03