據我所知,我不認爲這會使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