给定表达式foo
,我可以声明一个顶级函数
bar = foo
并按reifying foo
获取Type
bar
类型:
case reify 'bar of
VarI _ t _ _ -> t
是否可以直接获取foo
的类型,而无需创建bar
的冗余定义?理想情况下,作为Exp -> Q Type
类型的函数。
答案 0 :(得分:4)
您要求的功能类似于Exp -> Q Info
或Exp -> Q Type
,是吗? TH没有提供这样的功能。产生Info
的唯一TH函数是reify
,并且没有其他TH类型似乎暴露您所追求的类型信息。看来当前的TH API没有提供一种方法来表达任意表达式。
我不是GHC内部的专家,但在compiler/typecheck/TcSplice.hs
中探讨似乎确认reify
通过查找已编译(和类型检查)的实体并转换编译器的现有知识来工作其类型等为TH的Info
类型。对于任意Exp
,该信息不存在。我想我们必须通过另一个编译器传递来检测表达式。