Soweit ich das beurteilen kann, würde ich nicht glauben, dass es einen Unterschied machen würde, dass id1 und id2 aus einer Typklasse stammen und id1 'und id2' nicht. Ich benutze "ghc Rewrite" mit der neuesten Haskell Platform (sowohl mit GHC Version 7.0.4 als auch mit 7.4.1), und ich erwarte, dass to1 auch feuert.
%Vor%das Beispiel:
%Vor%(mehrere Änderungen im gesamten Beitrag mit aktualisierten Informationen)
Beachten Sie in Ihrer Ausgabe die Zeilen Rule fired: Class op id2
. Dies sind Regeln, die von GHC automatisch für Klasseninstanzen erstellt werden. Diese Regel wird zuerst ausgelöst, sodass Ihre eigene Regel nie eine Chance erhält. Wenn Sie mit "-ddump-simpl-iterations" kompilieren, können Sie überprüfen, ob die Klasse op-Regel in der ersten Phase ausgelöst wird, nach der Ihre "to1" -Regel niemals übereinstimmt.
Hier ist ein kleiner Umweg. Kommentieren Sie zuerst testThing1
, testThing1'
und testThing2'
, so dass nur testThing2
kompiliert wird. Dies ist die einzige Funktion, bei der "rewrite / to1" ausgelöst werden kann. Dadurch wird der Testfall, den Sie betrachten, isoliert. Als nächstes fügen Sie eine weitere Regel des Formulars hinzu:
und Sie sehen diese Ausgabe:
%Vor% Die neue Regel feuert nun anstelle der Klasse op, wodurch rewrite/to1'
den Ausdruck vereinfachen kann. Interessanterweise spielt es keine Rolle, ob die neue Regel oberhalb oder unterhalb von rewrite/to1
in der Liste der Regeln erscheint.
Ich weiß nicht, warum Ihre id2 (id2 a)
-Regel nicht übereinstimmt, während id2 a
dies tut. Es sieht so aus, als sollte es übereinstimmen (nach -dverbose-core2core), ist es aber nicht. Ich vermute immer noch einen GHC-Präzedenzfehler von einem Typ, obwohl ich auch das gleiche Verhalten mit ghc-7.4.1 sehe, also ist es nicht 4397 .
Tags und Links haskell