Rewrite rules kann mit Ihrer Programmoptimierung helfen. Und ich frage mich, ob sie funktionieren würden, wenn ich meine Objekte in newtype
verpacken würde. Wie es bekannt ist, newtype
bringt keine Leistungseinbußen, es ist eine Kompilierzeit Wrapper, die zur Laufzeit gegangen ist. Also frage ich mich, ob Rewrite-Regeln immer noch mit newtype
ausgelöst würden. Zum Beispiel gibt es viele Regeln für Data.Text
(What is fusion in Haskell?).Rewrite Regeln mit newtype
GHC Bedienungsanleitung warnt vor nicht-Pfiffigkeit des Algorithmus:
GHC verwendet derzeit einen sehr einfachen, syntaktischen Matching-Algorithmus die Regel LHS mit einem Ausdruck für den Abgleich. Es sucht nach einer Substitution, die LHS und Ausdruck syntaktisch der Modulo-Alpha-Umwandlung gleichsetzt. Das Muster (die Regel), aber nicht der Ausdruck, wird bei Bedarf erweitert. (Eta-Expandieren des Ausdrucks kann zu Faulheitsfehlern führen.) Aber keine Beta-Konvertierung (das wird als Anpassung höherer Ordnung bezeichnet).
Und jetzt arbeite ich mit Identity Text
(aus bestimmten Gründen). Würde ich diese Leistungsvorteile immer noch bekommen? Ich bin kein Experte in Rewrite-Regeln, um Benchmarks selbst durchzuführen und in ihren Ergebnissen sicherzustellen.
Vergessen Sie nicht, dass benutzerdefinierte Umschreibregeln nicht die einzige Optimierung sind, die GHC durchführt. Insbesondere Inlining kann den Code drastisch vereinfachen und erspart oft "newtypes". (Verschiedene Vereinfachungsdurchläufe erzeugen oft Teilausdrücke wie 'runIdentity.Identity', die trivialerweise gelöscht werden können.) Dies kann weiteren Feuern von Rewrite-Regeln erlauben. –