Можно ли получить тип любого выражения с помощью шаблона Haskell?

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

bar = foo

и получить тип foo как Type reification 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 работает, просматривая уже скомпилированный объект (и typechecked) и преобразование существующего знания своего типа и т.д. в тип TH Info. Эта информация не будет существовать для произвольного Exp. Я предполагаю, что нам придется отбросить это выражение обратно через другой проход компилятора.