2017-03-23 9 views
3

テンプレートハスケルでは、Qモナドはすべての魔法が起こる場所です。ただし、Qにはかなり限定されたAPIがあります。私は基本的にはlookupValueName :: String -> Q (Maybe Name)の機能を取り込むタイプvalueNameStore :: Q (String -> Maybe Name)の値を持っていますが、その時点で使用可能な変数のストアがバインドされています。Qモナドからの価値環境の抽出

これは理論的には音だと思います。最初にvalueNameStoreでバインドを呼び出すと、状態のスナップショットである共有の定数状態に関して実行する場合、ルックアップをシーケンスする必要はありません。


このが可能でない場合は、危険な方法でそれを通じ強制する方法はありますか? unsafePerformIO ... unsafePerformIO ...

答えて

0

答えは基本的にはありません。スコープ内の名前を何らかの形で列挙できる場合は、これを行うには不合理な方法があるかもしれません。あなたが提案した型とセマンティクスを持つ操作が完全に分かりやすいというのは間違いありませんが、それはunsafePerformIOであっても、提供されたインターフェイスから(合理的に)実装可能であるということを意味しません。

基本的に、文字列からNameへのマッピングは変更可能です。あなたがしたいことは、その変更可能な辞書のスナップショットを取る必要があります。 APIはそのような機能を提供せず、あなたが手動でデータをコピーするためのツールをあなたに提供していないこともわかります。 unsafePerformIOを使用しようとすると、ちょうどあなたがスコープを変更した場合は、Qアクションを呼び出したときに、ものとは異なるものになります、式が評価される時、にマッピングしているものは何でもバインディングを取得します。

+0

式が評価された時点でマッピングにマッピングされているものがあればどうなるでしょうか? 'unsafePerformIO'がどのように役立つのか分かりません。ええ、スナップショットのアイデアは私が思ったものですが、多くのものが範囲にあります。 Preludeだけでも... – Alec

+0

再び、 'unsafePerformIO'はここで助けになりません。 'lookupValueName'は' Q'モナドに存在し、ほとんどの操作(つまりすべてのルックアップ名)は 'Q'モナドをエスケープできません。 – Alec

+0

犯罪は意図されていませんが、あなたが提案していることを試していますか? 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

関連する問題