Come ottenere il valore letterale di un modello di chiamato variabile
-
27-10-2019 - |
Domanda
Se ho un Name
In TemplateHaskell e vuoi scoprire il valore della variabile che nomina, a condizione che la variabile sia dichiarata letterale, si può fare?
var = "foo"
-- Can `contentsOf` be defined?
$((contentsOf . mkName $ "var") >>= guard . (== "foo"))
Soluzione
In teoria, sì. In pratica, no.
Scoprire cose sui nomi esistenti è fatto usando reify :: Name -> Q Info
, e per una definizione del genere che torni a VarI
valore, che include a Maybe Dec
campo. Ciò sembrerebbe suggerire che in alcuni casi potresti essere in grado di ottenere l'albero di sintassi per la dichiarazione della variabile, che ti consentirebbe di estrarre il letterale, tuttavia Le versioni attuali di GHC ritorna sempre Nothing
in questo campo, quindi sei sfortunato per una soluzione pura.
Tuttavia, TH consente di eseguire azioni IO arbitrarie, quindi potresti potenzialmente aggirare questo caricando e analizzando il modulo usando qualcosa di simile Haskell-Src-Exts, tuttavia, sospetto che sarebbe più un problema di quanto valga la pena.