Можно ли получить тип любого выражения, используя 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
, Я полагаю, что мы должны были бы вернуть выражение через другой проход компилятора.