テンプレートハスケルでは、Q
モナドはすべての魔法が起こる場所です。ただし、Q
にはかなり限定されたAPIがあります。私は基本的にはlookupValueName :: String -> Q (Maybe Name)
の機能を取り込むタイプvalueNameStore :: Q (String -> Maybe Name)
の値を持っていますが、その時点で使用可能な変数のストアがバインドされています。Qモナドからの価値環境の抽出
これは理論的には音だと思います。最初にvalueNameStore
でバインドを呼び出すと、状態のスナップショットである共有の定数状態に関して実行する場合、ルックアップをシーケンスする必要はありません。
このが可能でない場合は、危険な方法でそれを通じ強制する方法はありますか? unsafePerformIO
... unsafePerformIO
...
式が評価された時点でマッピングにマッピングされているものがあればどうなるでしょうか? 'unsafePerformIO'がどのように役立つのか分かりません。ええ、スナップショットのアイデアは私が思ったものですが、多くのものが範囲にあります。 Preludeだけでも... – Alec
再び、 'unsafePerformIO'はここで助けになりません。 'lookupValueName'は' Q'モナドに存在し、ほとんどの操作(つまりすべてのルックアップ名)は 'Q'モナドをエスケープできません。 – Alec
犯罪は意図されていませんが、あなたが提案していることを試していますか? Quasi' 'の' IO'インスタンスが(http://hackage.haskell.org/package/template-haskell-2.11.1.0/docs/src/Language.Haskell.TH.Syntaxを[任意の検索を許可しません]。 html#line-124)。 'runQ'は助けにならないでしょう - 実際には(AFAIK)は' Q'をエスケープできません。 – Alec