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

Pet*_*lák 14 haskell types expression reify template-haskell

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

bar = foo
Run Code Online (Sandbox Code Playgroud)

并通过reifying获得fooas 类型:Type bar

case reify 'bar of
  VarI _ t _ _ -> t
Run Code Online (Sandbox Code Playgroud)

是否有直接获取类型的方法foo,而不创建冗余的定义bar?理想情况下作为类型的函数Exp -> Q Type.

Chr*_*kle 5

您要的是类似Exp -> Q Infoor的函数Exp -> Q Type,是吗?TH 没有提供这样的功能。产生 的唯一 TH 函数Inforeify,并且没有其他 TH 类型似乎公开您所追求的类型信息。目前的 TH API 似乎没有提供一种方法来具体化任意表达式。

我不是 GHC 内部的专家,但通过查找已经编译(和类型检查)的实体并将编译器对其类型等的现有知识转换为 TH 的类型,我compiler/typecheck/TcSplice.hs似乎可以确认这一点。对于任意. 我想我们必须通过另一个编译器传递来检测表达式。reifyInfoExp