Как получить буквальное значение именованной переменной TemplateHaskell
-
27-10-2019 - |
Вопрос
Если у меня есть Name
в TemplateHaskell и хотите узнать значение переменной, которую он называет, при условии, что переменная объявлена как литерал, можно ли это сделать?
var = "foo"
-- Can `contentsOf` be defined?
$((contentsOf . mkName $ "var") >>= guard . (== "foo"))
Решение
Теоретически да.На практике нет.
Узнать информацию о существующих именах можно с помощью reify :: Name -> Q Info
, и для такого определения вы получите обратно VarI
значение, которое включает в себя Maybe Dec
поле.Казалось бы, это предполагает, что в некоторых случаях вы сможете получить синтаксическое дерево для объявления переменной, что позволит вам извлечь литерал, однако текущие версии GHC всегда возвращают Nothing
в этом поле, так что вам не повезло с чистым решением TH.
Однако TH позволяет выполнять произвольные действия ввода-вывода, поэтому вы можете обойти это, загрузив и проанализировав модуль самостоятельно, используя что-то вроде haskell-src-exts, однако я подозреваю, что это будет больше проблем, чем пользы.