Как получить буквальное значение именованной переменной TemplateHaskell

StackOverflow https://stackoverflow.com/questions/9345532

Вопрос

Если у меня есть 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, однако я подозреваю, что это будет больше проблем, чем пользы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top