Rewrite-Regeln, die nicht für Regeln ausgelöst werden, die mehreren Instanzmethoden entsprechen

8

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%     
Akh 21.03.2012, 19:11
quelle

1 Antwort

5

(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:

%Vor%

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 .

    
John L 22.03.2012, 01:22
quelle

Tags und Links