BuiltinRules override other rules in some cases.
It seems that the Class op * rules will override a user defined rule for class functions.
This seems to be a long outstanding issue: http://stackoverflow.com/questions/9811294/rewrite-rules-not-firing-for-rules-matching-multiple-instance-methods
I also just ran into someone else on the haskell IRC channel who had an even simpler example then the one on that page:
{-# NOINLINE d #-}
{-# RULES "d exp" d exp = exp #-}
d :: (Double -> Double) -> (Double -> Double)
d f = f . (+20.0)
g :: Double -> Double
g = (+5.0)
main = do
print $ d exp 1.0 -- FAIL should print 2.718281828459045 >> printed exp 21.0 instead
print $ d g 3.0 -- PASS should print 28.0
-- Compiled with:
-- ghc -fenable-rewrite-rules -O rules.hs
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.10.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | high |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |