Почему нет представительства TH в TH?

Обратите внимание, что:

  • Exp в template-haskell соответствует HsExpr в ГХК АСТ
  • Type в template-haskell соответствует HsType в ГХК АСТ
  • Dec в template-haskell соответствует HsDecl в ГХК АСТ

Однако в типах template-haskell отсутствует один набор конструкторов: те, которые относятся к сращиваниям TH и квазикавычкам. Например, почему у Exp нет конструктора следующего вида?

SpliceE :: Exp -> Exp

Я тоже наткнулся на здесь. Я хотел бы знать, есть ли в этом что-то фундаментальное, или нужно просто проделать дополнительную работу, конкретизируя типы TH? Я подозреваю, что проблема в том, что при этом можно было бы отправить TH в бесконечный цикл - иметь соединение, генерирующее другое соединение, и так далее. Тем не менее, уже есть много способов заставить GHC расходиться... :)


В моем случае использования требуется дополнительный этап TH (чтобы я мог поднять значение до уровня типа - на родительском этапе это значение, но я могу сгенерировать код с этим значением, поднятым до уровня типа для дочернего этапа используя promote)


person Alec    schedule 28.01.2018    source источник
comment
Я сомневаюсь, что есть более глубокая причина, чем TH, хотя в любом случае это не реализовано как многопроходный интересный вопрос.   -  person Cubic    schedule 28.01.2018
comment
@Cubic Это правда? Я бы подумал, что этапы решат эту проблему... Разве GHC уже не делает это для объявлений? Основной пример.   -  person Alec    schedule 28.01.2018
comment
@Alec, ваш пример не обрабатывается GHC с использованием нескольких проходов. Скорее, GHC делит каждый исходный файл на минимальные группы объявлений (но взаимно рекурсивные группы не могут быть разделены) и обрабатывает каждую из них отдельно. По этой же причине код TH может ссылаться только на объявления выше в файле, вне текущей взаимно рекурсивной группы.   -  person Dominique Devriese    schedule 28.01.2018
comment
@DominiqueDevriese неправильный выбор слов относительно «множественного прохода». Помимо слов, это отличается от того, о чем я спрашиваю?   -  person Alec    schedule 28.01.2018
comment
Эээ.. да, AIUI. Я думаю, что Cubic говорил о сценарии, в котором TH сначала будет выполняться на этапе -2 для генерации нового кода TH этапа -1, который впоследствии будет выполняться для генерации фактического кода этапа 0. Таким образом, двигатель TH нужно будет запустить дважды, второй раз на выходе первой ступени. Этот тип многопроходности, вероятно, имеет всевозможные практические последствия для дизайна, которые, я не думаю, в настоящее время включены в TH ...   -  person Dominique Devriese    schedule 29.01.2018