2016-05-18 6 views
6

テンプレートのhaskellスプライスを作成していますが、正しい種類のNameを生成しようとしています。既知の名前(例えば、関数f)を生成する場合は、'fを使用できます。これはfが私がスプライスを定義している範囲である必要があります。どこで使われているのではなく、私が欲しいものです。現在のスコープを使用してテンプレートhaskellに動的名を生成

私は同じことが欲しいが、動的な名前が必要だ。たとえば、私のスプライスが引数としてn :: Intを取るとします。 Nameとして"f" ++ show nを生成し、使用サイトではなくスプライス定義サイトを検索します。

私は2つのオプションを試しました:mkNamelookupValueNameは両方とも、使用サイトのスコープに名前が必要です。一重引用符の構文には、動的名ではなくリテラル名が必要です。

最後に、私はmkNameGで実験を始めました。関数は私が使用しているものと同じパッケージから来ているので、パッケージ名で始まったが、それはエラーCan't find interface-file declaration for variable the-package-name:Some.Module.f0を与えた。いくつかのソースの読書の後、私はパッケージ名"main"が使われた場所を見つけました。それはGHCiで動作するようですが、コンパイルすると同じエラーが発生します。

これを行う方法はありますか?もちろん、すべてのオプションを列挙することもできますが、この演習のポイントはコードをより動的にすることです。

答えて

1

あなたは、特定のパッケージ名を特定のName'f0から抽出し、それをmkNameG_vに渡すことでこれを行うことができると思います。あなたはNameでを使用しようとするまでのエラーを取得mkNameGには何も渡すことができず、一方、識別子fは本当に、スコープ内にあることを'fチェックを書く

  • :これは、2つの理由のために良いアイデアではないかもしれません何らかの形で。実際に存在する識別子の場合はNameを作成するか、Nameを使用した場合はエラーの場合はrecoverを作成するようにしなければなりません(GHCで見たエラーで失敗させたくない場合を除きます)。

  • 書く'ffの使用とみなされます。未使用の未使用の定義は単に破棄されるため、mkNameGでそれらを参照することはできません。 "f" ++ show n識別子が確実に使用されるようにするには、他の方法が必要です。

+0

ありがとうございます。私の場合、あなたが言及している2つの問題は、実際問題ではないかもしれません。なぜなら、1)同じ入力からTHによって識別子が生成され、2)定義がエクスポートされるからです。もう1つ考えてみると、私はTHの2つの部分をマージして、問題を完全に取り除くことができます。 –

関連する問題