6

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

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

ответ

4

Теоретически, да. На практике нет.

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^