Можно ли получить тип любого выражения, используя Template Haskell?

Дано выражение fooЯ мог бы объявить функцию верхнего уровня

bar = foo

и получить тип foo как Type путем овеществления bar:

case reify 'bar of
  VarI _ t _ _ -> t

Есть ли прямой способ получения типа fooбез создания избыточного определения bar? Идеально как функция типа Exp -> Q Type,

1 ответ

Вы просите функцию такого типа, как Exp -> Q Info или же Exp -> Q Type, да? TH не предоставляет такой функции. Единственная функция TH, которая производит Info является reify и никакой другой тип TH, похоже, не предоставляет информацию о типе, которую вы ищете. Похоже, что текущий TH API не предоставляет возможности для преобразования произвольных выражений.

Я не эксперт во внутренних делах GHC, но ковыряюсь в compiler/typecheck/TcSplice.hs кажется, подтверждает, что reify работает путем поиска уже скомпилированной (и проверенной на тип) сущности и преобразования существующих знаний компилятора о его типе и т. д. в TH Info тип. Эта информация не будет существовать для произвольной Exp, Я полагаю, что мы должны были бы вернуть выражение через другой проход компилятора.

Другие вопросы по тегам