テンプレートのhaskellスプライスを作成していますが、正しい種類のName
を生成しようとしています。既知の名前(例えば、関数f
)を生成する場合は、'f
を使用できます。これはf
が私がスプライスを定義している範囲である必要があります。どこで使われているのではなく、私が欲しいものです。現在のスコープを使用してテンプレートhaskellに動的名を生成
私は同じことが欲しいが、動的な名前が必要だ。たとえば、私のスプライスが引数としてn :: Int
を取るとします。 Name
として"f" ++ show n
を生成し、使用サイトではなくスプライス定義サイトを検索します。
私は2つのオプションを試しました:mkName
とlookupValueName
は両方とも、使用サイトのスコープに名前が必要です。一重引用符の構文には、動的名ではなくリテラル名が必要です。
最後に、私はmkNameG
で実験を始めました。関数は私が使用しているものと同じパッケージから来ているので、パッケージ名で始まったが、それはエラーCan't find interface-file declaration for variable the-package-name:Some.Module.f0
を与えた。いくつかのソースの読書の後、私はパッケージ名"main"
が使われた場所を見つけました。それはGHCiで動作するようですが、コンパイルすると同じエラーが発生します。
これを行う方法はありますか?もちろん、すべてのオプションを列挙することもできますが、この演習のポイントはコードをより動的にすることです。
ありがとうございます。私の場合、あなたが言及している2つの問題は、実際問題ではないかもしれません。なぜなら、1)同じ入力からTHによって識別子が生成され、2)定義がエクスポートされるからです。もう1つ考えてみると、私はTHの2つの部分をマージして、問題を完全に取り除くことができます。 –