Cómo obtener el valor literal de una Templatehaskell llamada Variable
-
27-10-2019 - |
Pregunta
Si tengo un Name
En Templatehaskell y quiere averiguar el valor de la variable que nombra, siempre que la variable se declare como literal, ¿se puede hacer esto?
var = "foo"
-- Can `contentsOf` be defined?
$((contentsOf . mkName $ "var") >>= guard . (== "foo"))
Solución
En teoría, sí. En la práctica, no.
Descubrir cosas sobre los nombres existentes se termina utilizando reify :: Name -> Q Info
, y para una definición como esa, recuperarías un VarI
valor, que incluye un Maybe Dec
campo. Esto parece sugerir que en algunos casos podría obtener el árbol de sintaxis para la declaración de la variable, lo que le permitiría extraer el literal, sin embargo, Las versiones actuales de GHC siempre regresan Nothing
en este campo, así que no tienes suerte por una solución pura.
Sin embargo, esto permite que se ejecuten acciones arbitrarias de IO, por lo que podría trabajar alrededor de esto cargando y analizando el módulo usted mismo usando algo como Haskell-Src-ostros, sin embargo, sospecho que eso sería más problemas de lo que vale.