2017-04-09 4 views
5

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.

+2

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. –

Antwort

6

Rewrite-Regeln werden auf GHCs Zwischensprachenkern angewendet (und nicht auf Haskell). Zu dieser Zeit sind newtype größtenteils verschwunden. Zum Beispiel wird Identity xx |> c wo c ein Zwang ist dass wirftx :: Text in etwas vom Typ Identity Text.

Diese Modelle können sich gegenseitig aufheben, und dann können die Regeln wie üblich ausgelöst werden. Sie sollten also in der Lage sein, die Vorteile der Regeln zum Umschreiben von Texten zu nutzen, wenn alles zusammenpasst.

Leider gibt es keine festen Garantien, und ohne auf den Zwischencode zu schauen (und wissen, worauf zu achten ist, zB wenn Sie einen bestimmten Ort kennen, an dem Fusion stattfinden soll), können Sie nicht sicher sein, dass Identity nicht funktioniert Kommt hier auf Kosten.

+0

Vielen Dank! Ich hatte gehofft, einige Benchmarks zu sehen, aber eine solche Erklärung ist schon gut für mich. – Shersh