Ich spiele mit Vorlage Haskell. Ich möchte ein quasi quoter schaffen, die mich Standard initializers für Datensätze erstellen können, also so etwas wieGibt es eine Template-Haskell-Funktion zum Zitieren?
[record| data Config = { shouldDoX = True; featureY :: Integer, optionZ = Nothing } |]
sollte es ist die gleiche Syntax wie Datendeklarationen eine Funktion
defaultConfig = Config { shouldDoX = True, optionZ = Nothing }
Grundsätzlich erstellen, erweitert durch Standard Werte. Jetzt ist record
ein benutzerdefinierter QuasiQuoter, allerdings gibt es Ausdrücke und Typen, innerhalb derer ich mich selbst nicht analysieren möchte. Idealerweise müsste ich den Block innerhalb der geschweiften Klammern nur in Anweisungen aufteilen und nach =
und ::
suchen.
Also ich bin auf der Suche nach einer Funktion, die praktisch das gleiche wie zitiert mit [e| ...|]
oder [t| ...|]
tut. Ich habe Hoogle nach einer Funktion String -> ExpQ
oder String -> Q Exp
gesucht, aber nichts gefunden.
Falls ich nicht klar darüber bin, wonach ich suche: Ich weiß über QuasiQuoters. Wie ich bereits erwähnte: record
ist ein QuasiQuoter. Nun enthält der String, der an meinen Quasi-Quotierer übergeben wird, Ausdrücke (wie Node 7 (Node 8 Nil Nil) Nil
) und Typen (wie True
oder Maybe (Either A B)
). Ich könnte diese selbst analysieren, aber ich hoffe, dass es eine Funktion gibt, die es für mich tun wird, so als ob ich die Zeichenfolge in ein Zitat wie [e|...|]
übergeben würde.
Also: Ich bin auf der Suche nach einer Funktion, die ich einen Ausdruck als String oder einen Typ als String feed, und die das entsprechende Exp
oder Type
Objekt zurückgibt. Ich glaube, dass es in der Q-Monade leben muss, da es den Ausdruck oder Typ basierend auf dem Kontext (genau wie Zitate) auswerten sollte.
functionOfMyDreams "Node 7 (Node 8 Nil Nil) Nil" :: Q Exp
Ich denke, [haskell-src-meta] (http://hackage.haskell.org/package/haskell-src-meta) könnte das haben, wonach Sie suchen. – hammar