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"))
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top