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"))
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top