Erstellen einer Liste gültiger Konstruktoren

8

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?

    
Clinton 21.04.2017, 02:23
quelle

1 Antwort

2

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)

%Vor%

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.

BEARBEITEN

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>     

epsilonhalbe 21.04.2017 14:40
quelle

Tags und Links