2016-05-18 4 views
6

Ich schreibe eine Vorlage Haskell Spleiß, und ich kämpfe um die richtige Art von Name s zu generieren. Wenn ich einen bekannten Namen generieren möchte (zB eine Funktion f), kann ich 'f verwenden. Dies erfordert f, um in dem Bereich zu sein, in dem ich den Spleiß definiere, nicht wo er verwendet wird, was genau das ist, was ich möchte.Dynamischen Namen in Vorlage Haskell mit dem aktuellen Geltungsbereich generieren

Jetzt möchte ich das gleiche, aber für einen dynamischen Namen. Nehmen wir zum Beispiel an, dass mein Splice einen n :: Int als Argument verwendet. Ich möchte "f" ++ show n als Name generieren, blickte auf die Spleißdefinitions-Site, nicht die Website verwenden.

Ich habe ein paar Optionen ausprobiert: mkName und lookupValueName beide erfordern den Namen im Geltungsbereich der Website zu verwenden. Die einfache Anführungszeichen-Syntax benötigt einen Literalnamen, keinen dynamischen Namen.

Endlich begann ich mit mkNameG zu experimentieren. Da die Funktionen von demselben Paket kommen, in dem ich sie verwende, habe ich mit dem Paketnamen begonnen, aber das hat Fehler Can't find interface-file declaration for variable the-package-name:Some.Module.f0 verursacht. Nach einigem Lesen der Quelle habe ich Orte gefunden, wo der Paketname verwendet wurde. Das scheint in GHCi zu funktionieren, aber beim Kompilieren bekomme ich immer noch den gleichen Fehler.

Gibt es eine Möglichkeit, dies zu tun? Ich könnte natürlich alle Optionen aufzählen, aber ich möchte das vermeiden, da der ganze Sinn dieser Übung darin besteht, den Code dynamischer zu gestalten.

Antwort

1

ich denke, Sie können dies tun, indem Sie die Paketnamen von einer bestimmten Name'f0 Extrahieren, dann ist es zu mkNameG_v vorbei. Dies könnte nicht eine gute Idee, aus zwei Gründen:

  • Schreiben 'f überprüft, ob die Kennung f wirklich in Rahmen ist, während Sie etwas mkNameG und nicht bekommen einen Fehler passieren können, bis Sie versuchen, die Name in verwenden, irgendwie. Sie müssen auf andere Weise sicherstellen, dass Sie nur Name s für tatsächlich vorhandene Kennungen erstellen, oder recover aus dem Fehler, wenn Sie die Name verwenden (es sei denn, Sie möchten GHC nur mit dem angezeigten Fehler fehlschlagen lassen).

  • Schreiben 'f gilt auch als eine Verwendung von f. Nicht verwendete nicht exportierte Definitionen werden einfach verworfen, so dass Sie mit mkNameG nicht auf sie verweisen können. Sie müssen einen anderen Weg finden, um sicherzustellen, dass Ihre "f" ++ show n Bezeichner verwendet werden.

+0

Danke, das funktioniert super! Die zwei Probleme, die Sie erwähnen, sind in meinem Fall möglicherweise nicht wirklich problematisch, da: 1) Die Identifikatoren werden ebenfalls von TH erzeugt, von den gleichen Eingaben und 2) Die Definitionen werden exportiert. Wenn ich an etwas mehr denke, fällt mir auf, dass ich die beiden Teile von TH zusammenlegen und das Problem insgesamt loswerden könnte ... –

Verwandte Themen