TemplateHaskellに がName
あり、変数がリテラルとして宣言されている場合、その変数の値を知りたい場合、これを行うことはできますか?
var = "foo"
-- Can `contentsOf` be defined?
$((contentsOf . mkName $ "var") >>= guard . (== "foo"))
TemplateHaskellに がName
あり、変数がリテラルとして宣言されている場合、その変数の値を知りたい場合、これを行うことはできますか?
var = "foo"
-- Can `contentsOf` be defined?
$((contentsOf . mkName $ "var") >>= guard . (== "foo"))
理論的には、そうです。実際には、いいえ。
既存の名前に関するものを見つけるにはreify :: Name -> Q Info
、 を使用します。そのような定義では、フィールドVarI
を含む値が返されます。Maybe Dec
これは、場合によっては、変数の宣言の構文ツリーを取得できる可能性があることを示唆しているように思われます。これにより、リテラルを抽出できますが、GHC の現在のバージョンは常にNothing
このフィールドに返されるため、アウトです純粋なTHソリューションの幸運。
ただし、TH では任意の IO アクションの実行が許可されているため、 haskell-src-extsなどを使用してモジュールを自分でロードおよび解析することで、これを回避できる可能性がありますが、それは価値があるよりも多くの問題になると思います。