是否可以使用Template Haskell获取任何表达式?

时间:2014-01-31 21:56:53

标签: haskell types expression template-haskell reify

给定表达式foo,我可以声明一个顶级函数

bar = foo

并按reifying foo获取Type bar类型:

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

是否可以直接获取foo的类型,而无需创建bar的冗余定义?理想情况下,作为Exp -> Q Type类型的函数。

1 个答案:

答案 0 :(得分:4)

您要求的功能类似于Exp -> Q InfoExp -> Q Type,是吗? TH没有提供这样的功能。产生Info的唯一TH函数是reify,并且没有其他TH类型似乎暴露您所追求的类型信息。看来当前的TH API没有提供一种方法来表达任意表达式。

我不是GHC内部的专家,但在compiler/typecheck/TcSplice.hs中探讨似乎确认reify通过查找已编译(和类型检查)的实体并转换编译器的现有知识来工作其类型等为TH的Info类型。对于任意Exp,该信息不存在。我想我们必须通过另一个编译器传递来检测表达式。