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