ich eine Funktion in Template Haskell
haben, die die Typinformationen extrahiert für Summe von Rekord Konstrukteuren wie folgt:Performing Art Gleichheit in Vorlage Haskell
listFields :: Name -> Q ([[(String,Name,Type)]])
listFields name = do
TyConI (DataD _ _ _ cons _) <- reify name
let showClause (RecC conName fields) = (map (\(x,_,t) -> (nameBase $ x,x,t)) fields)
return $ map showClause cons
die Art dort für ein Feld gegeben, wie Sie im Vergleich Gleichheit dieser Typ mit einem bestimmten Typ wie GHC.Base.String
oder Data.Text.Internal.Text
? Ich sehe TypeQ
in TH
Dokumentation. Es baut Typausdruck auf. Ich kann jedoch keine Dokumentation darüber finden, wie ein bestimmter Typ wie String
oder Text
oder Int
erstellt wird, damit ich ihn für den Vergleich der Gleichheit verwenden kann? Ich schätze Hinweise dazu, wie man das macht, insbesondere wie man den AST für einen bestimmten Typ bekommt.
Der Grund für diese Frage ist, dass gegebenen Datensatzkonstruktor wir jedes Feld in konvertieren möchten. show
und pack
sollten jedoch für die Typen String
und Text
unterschiedlich benannt werden. So, müssen Sie verschiedene Spleiße generieren, wenn der Typ (keine Konvertierung) oder String
(nur Anruf pack
, nicht show
anrufen) oder etwas anderes (rufen Sie pack . show
unter der Annahme Show
Instanz existiert).
Da Sie Template Haskell zu lernen scheinen, bin ich eher neugierig, welche Ressourcen Sie verwenden. Ich habe noch keine guten finden können, um es selbst zu lernen. – dfeuer
Sie können also eine Gleichheitsüberprüfung mit '==' durchführen, aber das ist mit ziemlicher Sicherheit falsch, weil es nur eine rohe syntaktische Äquivalenz ist und Typ Synonyme nicht normalisiert, ganz zu schweigen von Umleitungen durch Module oder was auch immer. Du solltest besser eine überladene Typklasse schreiben, die sich nur bei 'String' oder etwas anders verhält und nur in deinem Codegen-Modul benutzt. Typgleichheit ist wirklich schwer. – jozefg
@dfeuer, zwei Hauptressourcen: [Beispiel für eine Funktion zur Ableitung] (https://ocharles.org.uk/blog/guest-posts/2014-12-22-template-haskell.html) und [eine ausführliche Übersicht über TH ] (https://artyom.me/lens-over-tea-6#template-haskell). Ständiges Experimentieren in 'ghci' mit der Hackageseite für [' TH'] (https://hackage.haskell.org/package/template-haskell-2.10.0.0/docs/Language-Haskell-TH.html) in einem anderen Browser hilft viel. Die AST-Generierung in 'ghci' mit einfachem Code und das Verständnis der Bedeutung von' Name' in 'TH' halfen mir dabei, schnell zu beschleunigen. – Sal