Ein Beispiel sagt mehr als tausend Worte. Hier ist eine ziemlich einfache quasi quoter, die ich gerade erfunden habe.Variablen in Vorlage Haskell benutzerdefinierte Quasiquoter
import Language.Haskell.TH.Quote
import Language.Haskell.TH.Syntax
quoter :: QuasiQuoter
quoter = QuasiQuoter { quotePat = parse }
where
parse :: String -> Q Pat
parse ('$':x) = pure (VarP (mkName x))
parse "_" = pure WildP
parse _ = fail "Invalid pattern"
Dann wird unter Verwendung es in GHCi
ghci> :set -XQuasiQuotes
ghci> [quoter|_|] = 2
ghci> [quoter|$x|] = 2
ghci> x
error: Variable not in scope: x
Ich würde 2
-x
gebunden zu sein, gefallen. Also: Gibt es eine Möglichkeit, variable Muster in benutzerdefinierten Quasi-Anführungszeichen einzuführen, die wir wieder verwenden können? Beachten Sie, dass mein tatsächlicher Anwendungsfall ein bisschen mehr beteiligt ist als das oben genannte - parse
tatsächlich einige wesentliche Arbeit.
EDIT
Die folgenden Werke:
ghci> inc [quoter|$x|] = x + 1
ghci> inc 2
3
und die folgende nicht
ghci> let [quoter|$x|] = 1 in x
error: Variable not in scope: x
so ist dies ein Fehler in GHCi?
Das Verhalten in GHC 7.10.3 kann nicht reproduziert werden. – Zeta
@ Zeta Cool. Ich werde es am 7.10.3 ausprobieren, nur um es zu überprüfen, dann werde ich einen Fehler einreichen. Ich werde hier zurück posten, sobald das erledigt ist. – Alec
[Abgelegt als ein Fehler] (https://ghc.haskell.org/trac/ghc/ticket/13473#ticket). Hinweis: Ich bin nicht davon überzeugt, dass dies wirklich ein Fehler ist .... – Alec