Por lo que puedo decir, no creo que suponga ninguna diferencia que id1 e id2 sean de una clase de tipo y id1 'e id2' no. Estoy ejecutando "ghc Rewrite" con la última plataforma Haskell (tanto con GHC versión 7.0.4 como ahora 7.4.1 también), y espero que también se active.Reescribir las reglas que no se activan para las reglas que coinciden con los métodos de instancia múltiple
$ 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
el ejemplo:
{-# 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
Acabo de instalar la versión más reciente de GHC - versión 7.4.1 y ahora obtengo el mismo resultado que antes. Además, sí, me doy cuenta de que estas reglas no influyen en la salida: acabo de hacer este caso de prueba para aislar el problema que estaba obteniendo en un ejemplo mucho más complicado. Además, creo que la precedencia está funcionando correctamente aquí ... simplemente mirando la salida realmente parece que todas mis reglas se están intentando antes de que aparezcan. – Akh
¿Cómo está determinando exactamente que se intentaron sus reglas? No conozco ninguna forma de hacer que GHC muestre reglas que no se aplican, o qué regla se usa en el caso de múltiples coincidencias. Lo mejor que puede hacer es verificar lo que realmente se dispara, que en este caso es la regla de clase op. –
Si cambia el programa para que el método de instancia devuelva algo así como un error, es decir, algo diferente al 'RDUnit' que la regla de reescritura debería dejarle, el optimizador le deja el valor del error en el ejemplo' testThing2'. Creo que este programa de ejemplo simplemente se redujo demasiado para mostrar el problema más claramente. – Anthony