2017-03-23 4 views
3

In Template Haskell, die Q Monade ist, wo alles geht. Allerdings hat Q eine ziemlich begrenzte API. Ich hätte gerne einen Wert vom Typ valueNameStore :: Q (String -> Maybe Name), der im Prinzip die Funktionalität lookupValueName :: String -> Q (Maybe Name) erfasst, aber mit dem Speicher der Variablen, die im Moment der Bindung verfügbar sind.Extract Wert Umgebung von Q Monade

Ich denke, das theoretisch fundiert ist: Ich soll nicht meine Lookups sequenzieren muß, wenn ich sie in Bezug auf einen gemeinsamen konstanten Zustand bin durchführen, die eine Momentaufnahme des Zustands der Q ist, wenn ich zunächst binden auf valueNameStore genannt.


Wenn diese nicht möglich ist, ist es eine Möglichkeit, sie zu zwingen, in einem unsicheren Weg durch? Ich bin bereit, mich zu senken, was auch immer Hacks die unsafePerformIO ...

Antwort

0

Die Antwort ist im Grunde nicht. Es kann eine unangemessene Möglichkeit geben, dies zu tun, wenn Sie die Namen im Bereich irgendwie aufzählen können. Während Sie richtig sind, dass eine Operation mit dem Typ und der Semantik, die Sie vorschlagen, vollkommen vernünftig ist, bedeutet das nicht, dass sie (angemessen) von der bereitgestellten Schnittstelle sogar mit unsafePerformIO implementierbar ist.

Grundsätzlich ist die Abbildung von Zeichenfolgen zu Name s wandelbar. Was Sie tun möchten, erfordert einen Schnappschuss dieses veränderbaren Wörterbuchs. Die API bietet keine solche Funktionalität und, soweit ich das beurteilen kann, bietet sie auch nicht die Werkzeuge, um die Daten manuell selbst zu kopieren. Der Versuch, unsafePerformIO zu verwenden, wird nur dazu führen Sie, was Bindungen zu erhalten, sind in der Abbildung zu der Zeit der Ausdruck ausgewertet wird, die, wenn Sie Spielraum Zeit geändert haben, als die, die anders sein, wenn Sie die Q Aktion aufgerufen.

+0

Was passiert, wenn ich _was_ bereit, was Zuordnungen zu erhalten, ist in der Abbildung zu der Zeit wird der Ausdruck ausgewertet? Ich sehe nicht, wie "unsafePerformIO" helfen würde. Ja, die Snapshot-Idee ist, was ich dachte, aber ... eine Menge Zeug ist in Reichweite. Auch nur das Vorspiel ... – Alec

+0

Auch hier hilft "unsafePerformIO" nicht. 'lookupValueName' lebt in der' Q' Monade und die meisten Operationen (nämlich alle Nachschlageoperationen) können nicht aus der 'Q' Monade entkommen. – Alec

+0

Nichts für ungut beabsichtigt, aber versuchen Sie sogar die Dinge, die Sie vorschlagen? Die 'IO' Instanz von' Quasi' [erlaubt keine Lookups] (http://hackage.haskell.org/package/template-haskell-2.11.1.0/docs/src/Language.Haskell.TH.Syntax. html # Zeile-124). 'runQ' wird nicht helfen - du kannst tatsächlich (AFAIK)' Q' nicht entkommen. – Alec