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% 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:
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:
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:
Tags und Links haskell template-haskell