Auswerten einer Funktion zur Kompilierungszeit mit Template Haskell

8

Ich schreibe eine einfache HashString-Klasse, die nur eine Zeichenfolge und deren Hash ist:

%Vor%

Nun versuche ich diese zur Kompilierzeit mit etwas wie:

zu erzeugen %Vor%

Ich möchte, dass der Hash und der Text zur Kompilierungszeit passieren. Wie mache ich das?

Hier ist, was ich bisher versucht habe, aber ich bin mir nicht sicher, ob es richtig ist, noch bin ich sicher, dass es alles zur Kompilierzeit tut:

%Vor%     
Clark Gaebel 11.02.2012, 20:29
quelle

1 Antwort

14

Wie Sie Ihren Code geschrieben haben, wird bei der Kompilierung keine Auswertung stattfinden. Wenn Sie einen Haskell-Ausdruck mit [| ... |] quotieren, wird der zitierte Code / AST eingefügt, wo Sie ihn ohne Bewertung anwenden, also schreiben Sie:

%Vor%

entspricht genau dem Schreiben:

%Vor%

Aber denken Sie darüber nach: Sie verwenden [| ... |] , um einen Ausdruck zu zitieren, der später eingefügt werden soll, und Sie generieren Code zur Kompilierungszeit mit $(...) . Wenn Sie also den Code $(foo) in einen zitierten Ausdruck bla = [| bar $(foo) |] einfügen, generiert $(bla) den Code bar $(foo) , der wiederum foo zur Kompilierzeit auswertet. Um auch einen Wert zu verwenden, den Sie zur Kompilierzeit generieren und einen Ausdruck daraus generieren, verwenden Sie lift Funktion. Also, was du machen willst ist das:

%Vor%

Dies wertet die Hash-Funktion zur Kompilierzeit aus, da der innere Spleiß aufgelöst wird, nachdem der äußere Spleiß aufgelöst wurde. Übrigens ist die Verwendung von fromString von Data.String die generische Methode, um einen OverloadedString -Datentyp aus einem String zu konstruieren.

Sie sollten auch überlegen, einen Quasi-Quotierer für Ihre HashString -Schnittstelle zu erstellen. Die Verwendung von Quasi-Quotiern ist natürlicher als das manuelle Aufrufen von Spleißfunktionen (und Sie haben sie bereits verwendet; der namenlose [| ... |] quotierer zitiert Haskell-Ausdrücke).

Sie würden einen Quasiquoter wie folgt erstellen:

%Vor%

Damit könnten Sie HashString s mit dieser Syntax schreiben:

%Vor%     
dflemstr 11.02.2012, 21:26
quelle

Tags und Links