2017-03-23 8 views
3

템플릿 하스켈에서 Q 모나드는 모든 마술이 일어나는 곳입니다. 그러나 Q에는 매우 제한된 API가 있습니다. 나는 valueNameStore :: Q (String -> Maybe Name) 타입의 값을 갖고 싶다. 기본으로는 lookupValueName :: String -> Q (Maybe Name)이지만 아직 사용 가능한 변수의 저장소는 바인딩되어있다. Q 모나드에서 가치 환경 추출

나는이 이론적으로 소리라고 생각 : 나는 내가 처음 valueNameStore에 바인드라는 Q의 상태의 스냅 샷입니다 공유 일정한 상태에 관하여를 수행하고있는 경우 내 조회 염기 서열을 할 필요가 없습니다. 이 수없는 경우


, 안전하지 않은 방법으로 그것을 통해 강제의 방법은 무엇입니까? 나는 해킹이 무엇이든간에 자신을 낮추려고한다 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