Как получить буквальное значение переменной TemplateHaskell - PullRequest
6 голосов
/ 19 февраля 2012

Если у меня есть Name в TemplateHaskell и я хочу узнать значение переменной, которую она называет, при условии, что переменная объявлена ​​как литерал, это можно сделать?

var = "foo"
-- Can `contentsOf` be defined?
$((contentsOf . mkName $ "var") >>= guard . (== "foo"))

1 Ответ

4 голосов
/ 19 февраля 2012

В теории да. На практике нет.

Поиск информации о существующих именах выполняется с помощью reify :: Name -> Q Info, и для такого определения вы получите значение VarI, которое включает в себя поле Maybe Dec. Это может свидетельствовать о том, что в некоторых случаях вы можете получить синтаксическое дерево для объявления переменной, что позволит вам извлечь литерал, однако текущие версии GHC всегда возвращают Nothing в этом поле. , так что вам не повезло с чистым решением TH.

Однако TH разрешает выполнение произвольных действий ввода-вывода, поэтому вы можете обойти это, загрузив и проанализировав модуль самостоятельно, используя что-то вроде haskell-src-exts , однако я подозреваю, что больше проблем, чем стоит.

...