TemplateHaskell에 Name
이 있고이 변수의 이름이 리터럴로 선언 된 경우이 변수의 값을 확인하려면이 작업을 수행 할 수 있습니까?변수 이름이 TemplateHaskell이라는 리터럴 값을 얻는 방법
var = "foo"
-- Can `contentsOf` be defined?
$((contentsOf . mkName $ "var") >>= guard . (== "foo"))
TemplateHaskell에 Name
이 있고이 변수의 이름이 리터럴로 선언 된 경우이 변수의 값을 확인하려면이 작업을 수행 할 수 있습니까?변수 이름이 TemplateHaskell이라는 리터럴 값을 얻는 방법
var = "foo"
-- Can `contentsOf` be defined?
$((contentsOf . mkName $ "var") >>= guard . (== "foo"))
이론상으로 그렇다. 실제로, 아니오.
기존 이름에 대한 내용을 찾으려면 reify :: Name -> Q Info
을 사용하고, 이와 같은 정의의 경우 Maybe Dec
필드를 포함하는 VarI
값을 다시 가져올 수 있습니다. 이것은 어떤 경우에는 변수의 선언을위한 문법 트리를 얻을 수 있지만 리터럴을 추출 할 수 있다고 제안하는 것처럼 보일 것입니다 (current versions of GHC always returns Nothing
in this field). 그래서 당신은 순수한 TH 솔루션을 얻지 못할 것입니다.
그러나 TH는 임의의 IO 작업을 실행할 수 있으므로 haskell-src-exts과 같은 것을 사용하여 모듈을로드하고 구문 분석하여 잠재적으로이 문제를 해결할 수 있습니다. 그러나 그게 가치있는 것보다 더 많은 문제가 될 것으로 생각됩니다.