6

TemplateHaskellに がNameあり、変数がリテラルとして宣言されている場合、その変数の値を知りたい場合、これを行うことはできますか?

var = "foo"
-- Can `contentsOf` be defined?
$((contentsOf . mkName $ "var") >>= guard . (== "foo"))
4

1 に答える 1

4

理論的には、そうです。実際には、いいえ。

既存の名前に関するものを見つけるにはreify :: Name -> Q Info、 を使用します。そのような定義では、フィールドVarIを含む値が返されます。Maybe Decこれは、場合によっては、変数の宣言の構文ツリーを取得できる可能性があることを示唆しているように思われます。これにより、リテラルを抽出できますが、GHC の現在のバージョンは常にNothingこのフィールドに返されるため、アウトです純粋なTHソリューションの幸運。

ただし、TH では任意の IO アクションの実行が許可されているため、 haskell-src-extsなどを使用してモジュールを自分でロードおよび解析することで、これを回避できる可能性がありますが、それは価値があるよりも多くの問題になると思います。

于 2012-02-19T01:53:53.433 に答える