Comment obtenir la valeur littérale d'une variable appelée TemplateHaskell
-
27-10-2019 - |
Question
Si j'ai Name
TemplateHaskell et que vous souhaitez connaître la valeur de la variable qu'il nomme, à condition que la variable est déclarée comme un littéral, cela peut-il être fait?
var = "foo"
-- Can `contentsOf` be defined?
$((contentsOf . mkName $ "var") >>= guard . (== "foo"))
La solution
Dans la théorie, oui. Dans la pratique, non.
Trouver des trucs sur les noms existants est effectuée en utilisant reify :: Name -> Q Info
, et pour une définition comme vous retrouverais une valeur VarI
, qui comprend un champ Maybe Dec
. Cela semble suggérer que vous pourriez, dans certains cas, être en mesure d'obtenir l'arbre de syntaxe pour la déclaration de la variable, ce qui vous permettra d'extraire le sens littéral, mais les versions actuelles de GHC retourne toujours Nothing
dans ce sur le terrain, de sorte que vous êtes hors de la chance pour une solution pure TH.
Cependant, TH ne permettent arbitraires actions IO à exécuter, de sorte que vous pourriez potentiellement contourner ce en chargeant le module et l'analyse syntaxique vous en utilisant quelque chose comme haskell-src-exts , mais je pense que ce serait plus d'ennuis que cela vaut la peine.