Betrachten Sie Folgendes:
%Vor% Grundsätzlich ist x1
die Liste aller gültigen Konstruktoren für D T1
und x2
ist die Liste aller gültigen Konstruktoren für D T2
.
Ich möchte jedoch, dass diese Listen alle zusätzlichen Konstruktoren widerspiegeln, die zu D
hinzugefügt wurden. Ich möchte diese Listen nicht so hart codieren, wie sie gerade sind.
Gibt es eine Möglichkeit, x1
und x2
so zu definieren, dass sie automatisch aus D
erzeugt werden?
Disclaimer - mein TemplateHaskell-fu ist fast nicht existent - aber ich habe ein bisschen untersucht, was dir einen Ausgangspunkt geben sollte:
Für diejenigen, die nicht wissen, Template Haskell ist eine Art von Meta-Programmierung (Sprache), die es ermöglicht, Programme zu schreiben, die zur Kompilierzeit laufen - es ist Typ überprüft, so dass es sicher ist (für einige Definition von Safe, denke ich Sie können Programme schreiben, die unendlich viel Zeit zum Kompilieren benötigen.)
%Vor% Sie können beginnen, indem Sie die Datei in GHCi laden (vergessen Sie nicht :set -XTemplateHaskell
dort)
typeInfo
ist ein Q Info
, mit dem Sie Informationen aus einem Typ extrahieren können (escaped by ''
) - das $(..)
funktioniert wie print.
Dies gibt Ihnen die Vorlage haskell Ausdruck, der Ihr (G) ADT konstruiert:
%Vor% I mit ein wenig Mustererkennung - Sie können die Konstruktoren finden, die entweder keine Einschränkung haben ( ForallC
) oder einen bestimmten Typ ( TMP.T1
/ TMP.T2
) und dann einen Ausdruck schreiben - um einen neuen Typ zu erstellen von denen.
Im Moment habe ich nicht genug Zeit, um das zu liefern - aber ich werde diese Antwort heute Abend aktualisieren.
Ich habe ein wenig mehr auf das Konstruieren von Typen geschaut, aber ich muss zugeben, dass ich selbst ein bisschen feststecke - ich habe die Typinfo-Art erfolgreich dekonstruiert.
%Vor% Ich denke, es ist machbar, die T1
/ T2
/ forall d
von hier aus zu filtern, langwierig, aber machbar, um die Listen zu erstellen.
Was bei mir fehlgeschlagen ist, ist den Typ zu konstruieren - wenn ich die Datei in Ghci laden kann ich
ausführen %Vor%aber wenn ich das in der Datei anrufe, bekomme ich den folgenden Fehler
%Vor% Ich weiß, dass zum Beispiel Edward Kmett einige th-magische Linsen für Sachen macht und dort in der gleichen Datei funktioniert, aber der Spleiß ist keiner Variablen zugewiesen - also müssen Sie vielleicht die Namen für Ihre Listen darin erstellen Q Exp
- Ich denke, mkName
wäre etwas, das du dort brauchst.
Dies schließt alles, was ich herausgefunden habe - ich hoffe, es hilft, ich habe zumindest ein paar Dinge gelernt - für eine vollständige Antwort vielleicht jemand klüger / erfahrener mit Vorlage haskell kann einige seiner / ihrer Kenntnisse in einer zweiten Antwort liefern / p>